我正在用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);
}
我没有想法。如您所见,我对数据处理技术的了解有限。任何人?
答案 0 :(得分:3)
最明显的事情是将其保存到数据库中。然后存储和检索非常简单。
如果由于某种原因你无法做到这一点,那么我认为你现在的解决方案是要走的路。您的解析代码看起来非常简单。我创建了一个单独的函数来解析返回一行响应数组的行,然后让调用者做任何需要完成的操作,只是为了干净的模块化。
答案 1 :(得分:1)
有几点:
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>(); } }