【问题标题】:What's a better way to save response sets in this situation?在这种情况下保存响应集的更好方法是什么?
【发布时间】:2011-04-16 21:14:57
【问题描述】:

我正在用 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);
}

我没有想法。如您所见,我对数据处理技术的了解有限。有接盘侠吗?

【问题讨论】:

    标签: java arrays save


    【解决方案1】:

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

    如果您出于某种原因无法做到这一点,那么我认为您目前的解决方案是可行的方法。您的解析代码对我来说看起来很简单。我会创建一个单独的函数来解析一行,该行返回一行的响应数组,然后让调用者做任何需要做的事情,只是为了干净的模块化。

    【讨论】:

    • 谢谢!我不使用数据库的唯一原因是因为我不知道如何使用数据库:">
    • @Anita:嗯,如果您正在寻找一个快速、短期的答案,这是一个很好的理由。从长远来看,我建议学习使用数据库!我不知道您的托管安排是什么,但您可以免费获得 MySQL 或 Postgres,而且我曾经使用过的任何托管公司都至少提供其中一个作为软件包的一部分。
    【解决方案2】:

    几点:

    1. 使用 ObjectOutputStream 保存数据通常是个坏主意。以人类可读的形式保存数据是一个更好的选择。
    2. 我不明白你为什么认为你的解析逻辑“很可怕”——当然你可以稍微清理一下代码,但从根本上来说,它似乎没问题。
    3. 您是否考虑将数据存储在数据库中...关系或其他方式?
    4. 我不会使用数组索引位置来将答案与问题联系起来,而是使用问题 ID。这样,调查可以随着时间的推移而发展,您仍然会有半可用的数据。至少,您将获得部分完整的答案。如果你想要这种结构的简约持久化形式,一个想法是在每一行文本中存储{记录、问题、答案}。读取数据会产生Map&lt;record, Map&lt;question, answer&gt;&gt;。您可能会在此处找到有用的“自动映射”构造:
    公共抽象类 AutoMap 扩展 TreeMap { 受保护的抽象 V createValue(); 公共 V getOrCreate(K 密钥) { V 值 = 获取(键); 如果(值 == 空){ 价值 = 创建价值(); 放(键,值); } 返回值; } } 公共类 MapOfMaps 扩展 AutoMap> { 受保护的地图 createValue() { 返回新的 TreeMap(); } }

    【讨论】:

    • 这听起来确实是个不错的解决方案!如果我被要求改进上面的代码,我一定会使用它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    相关资源
    最近更新 更多