在这种情况下保存响应集的更好方法是什么?

时间:2010-09-24 16:24:21

标签: java arrays save

我正在用Java构建一个CLI调查应用程序,让用户可以回答多项选择题。请告诉我如何改进我的方法。

问题的每个答案都记录为一个int,它是该问题的选择数组中该选择的索引。调查的所有答案都保存为int数组。我正在考虑使用ObjectOutputStream序列化这个int数组。然后当我需要显示结果时,我将恢复数组并在标签后打印每个元素。

这种方法的问题是(我相信)第二组响应会覆盖第一组。我想到了两种选择,两者都听起来很糟糕。一种是将每个响应集保存到单独的文件中。但是接下来是显示时间,我必须立即读取所有文件以保持对同一个问题的响应。另一种是将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 个答案:

答案 0 :(得分:3)

最明显的事情是将其保存到数据库中。然后存储和检索非常简单。

如果由于某种原因你无法做到这一点,那么我认为你现在的解决方案是要走的路。您的解析代码看起来非常简单。我创建了一个单独的函数来解析返回一行响应数组的行,然后让调用者做任何需要完成的操作,只是为了干净的模块化。

答案 1 :(得分:1)

有几点:

  1. 使用ObjectOutputStream保存数据通常是个坏主意。以人类可读的形式保存数据是一个很好的选择。
  2. 我不明白为什么你认为你在那里的解析逻辑是“恐怖” - 确保你可以稍微清理一下代码,但从根本上说,似乎没问题。
  3. 您是否考虑过将数据存储在数据库中......关系还是其他?
  4. 我不使用数组索引位置来回答问题,而是使用问题ID。这样,调查可以随着时间的推移而发展,您仍将拥有半可用数据。至少,你会有一个部分完整的答案。如果你想要这种结构的简约持久化形式,一个想法是在每行文本中存储{record,question,answer}。读取数据会产生Map<record, Map<question, answer>>。您可以在这里找到一个有用的'automap'构造:
  5.     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>();
          }
        }