Какой лучший способ сохранить наборы ответов в этой ситуации? - PullRequest
1 голос
/ 24 сентября 2010

Я создаю приложение для опроса CLI на Java, которое позволяет пользователям отвечать на вопросы с несколькими вариантами ответов.Пожалуйста, скажите мне, как мой подход может быть улучшен.

Каждый ответ на вопрос записывается в виде целого числа, которое является индексом этого выбора в массиве вариантов ответа на этот вопрос.Все ответы на опрос сохраняются в виде массива int.Я думаю о сериализации этого массива int с помощью ObjectOutputStream.Затем, когда мне понадобится отобразить результаты, я восстановлю массив и напечатаю каждый элемент после вкладки.

Проблема с этим подходом состоит в том (я полагаю), что второй набор ответов перезаписывает первый.Я подумал о двух альтернативах, оба из которых звучат плохо.Каждый сохраняет каждый набор ответов в отдельный файл.Но вот пришло время показа, мне нужно будет прочитать все файлы одновременно, чтобы сохранить ответы на один и тот же вопрос.Другой - сохранение массива int в виде строки, разделенной табуляцией, в текстовом файле (поэтому каждый набор ответов создает новую строку), затем токенизация и анализ его обратно в массив int для отображения.Но тогда код токенизации / разбора - ужас для чтения (в настоящее время это выглядит так):

РЕДАКТИРОВАТЬ: Ой, этот код даже не прав.Суть в том, что синтаксический анализ - беспорядок, поэтому я ищу способ не разбирать.

File savedResults = new File(Main.surveyResultsFolder, surveyFileName);
try {
    BufferedReader br = new BufferedReader(new FileReader(savedResults));
    int[] currentResponseSet = new int[noOfQuestions];
    String currentResponseString = "";
    String[] currentResponseStrArray = null;
    while((currentResponseString = br.readLine()) != null) {
        currentResponseStrArray = currentResponseString.split("\t");

    for (int i = 0; i < currentResponseStrArray.length; i++) {
        currentResponseSet[i] = Integer.parseInt(currentResponseStrArray[i]);
}
    }
     //then I'll print currentResponseSet here.
    }
catch (IOException ex) {
    System.out.println("Error reading results file " + surveyFileName);
}

У меня нет идей.Как видите, мои знания о методах обработки данных ограничены.Любой берущий?

Ответы [ 2 ]

3 голосов
/ 24 сентября 2010

Самое очевидное, что нужно сделать, это сохранить его в базе данных. Тогда хранение и поиск очень просты.

Если вы не можете сделать это по какой-либо причине, то я думаю, что ваше настоящее решение - это путь. Ваш код синтаксического анализа выглядит довольно просто для меня. Я бы создал отдельную функцию для анализа строки, которая возвращает массив ответов для одной строки, а затем чтобы вызывающая сторона делала с ней все, что нужно, только для чистой модульности.

1 голос
/ 24 сентября 2010

Несколько моментов:

  1. Сохранение данных с использованием ObjectOutputStream, как правило, плохая идея.Сохранение данных в удобочитаемой форме - лучший выбор.
  2. Я не понимаю, почему вы считаете, что логика синтаксического анализа, которая у вас есть, - это «ужас» - конечно, вы можете немного очистить код, но принципиально, вроде бы нормально.
  3. Рассматривали ли вы хранение данных в базе данных ... реляционным или иным образом?
  4. Вместо использования позиции индекса массива для привязки ответа к вопросу, я быиспользуйте идентификаторы вопросов.Таким образом, опрос может развиваться с течением времени, и у вас все еще будут полуиспользуемые данные.По крайней мере, у вас будут частично полные ответы.Если вам нужна минималистичная форма персистентности для такой структуры, одной идеей является сохранение {запись, вопрос, ответ} в каждой строке текста.Чтение данных даст Map<record, Map<question, answer>>.Вы можете найти полезную конструкцию 'automap' здесь:
    public abstract class AutoMap<K extends Comparable, V> 
    extends TreeMap<K, V> {
      protected abstract V createValue();

      public V getOrCreate(K key) {
        V value = get(key);
        if (value == null) {
          value = createValue();
          put(key, value);
        }
        return value;
      }
    }

    public class MapOfMaps<J extends Comparable, K extends Comparable, V> 
    extends AutoMap<J, Map<K, V>> {
      protected Map<K, V> createValue() {
        return new TreeMap<K, V>();
      }
    }
...