2010-09-24 79 views
1

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

我沒有想法。正如你所看到的,我對數據處理技術的瞭解是有限的。任何接受者?

回答

1

幾點:

  1. 使用ObjectOutputStream保存數據通常是一個壞主意。以人類可讀形式保存數據是一個絕佳的選擇。
  2. 我不明白你爲什麼認爲你在那裏的解析邏輯是'一個恐怖' - 確保你可以清理一些代碼,但從根本上說,它似乎沒問題。
  3. 您是否考慮過將數據存儲在數據庫中......關係數據庫還是其他數據庫?
  4. 而不是使用數組索引位置來綁定問題的答案,我會使用問題ID。這樣,調查可以隨着時間的推移而發展,並且您仍然可以獲得半可用數據。至少,你會得到部分完整的答案。如果你想要這種結構的簡約持久性形式,一個想法是在每一行文本中存儲{記錄,問題,答案}。讀取數據將產生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>(); 
     } 
    } 
+0

這聽起來像是一個很好的解決方案!如果我被要求改進上面的代碼,我一定會用它:) – 2010-09-25 15:49:18

3

最明顯的做法是將其保存到數據庫。然後存儲和檢索非常簡單。

如果因爲任何原因你不能這樣做,那麼我認爲你現在的解決方案就是要走的路。你的解析代碼對我來說很簡單。我會創建一個單獨的函數來解析返回一行響應數組的行,然後讓調用者完成需要完成的任何操作,僅用於乾淨的模塊化。

+0

謝謝!我不使用數據庫的唯一原因是因爲我不知道如何使用數據庫:「> – 2010-09-25 15:48:05

+0

@Anita:那麼,如果你正在尋找一個快速,短期的答案,這是一個很好的理由。從長遠來看,我建議學習使用數據庫!我不知道你的主機安排是什麼,但是你可以免費獲得MySQL或Postgres,而且我曾經使用過的任何託管公司都至少提供了其中一個部分包裝 – Jay 2010-09-27 14:39:55

相關問題