2011-09-29 68 views
4

我想要將某個變量的所有值存儲在數據集中,以及每個值的頻率。爲此,我使用ArrayList<String>來存儲值,並使用ArrayList<Integer>來存儲頻率(因爲我不能使用int)。不同值的數量是未知的,這就是爲什麼我使用ArrayList而不是Array如何優化ArrayList中值的更新<Integer>

實施例(簡化的)數據集:

a,b,c,d,b,d,a,c,b 

ArrayList<String>與值看起來像:{a,b,c,d}ArrayList<Integer>與頻率的樣子:{2,3,2,2}

要填充這些ArrayLists我使用以下代碼遍歷數據集中的每條記錄。

public void addObservation(String obs){ 
    if(values.size() == 0){// first value 
     values.add(obs); 
     frequencies.add(new Integer(1)); 
     return;//added 
    }else{ 
     for(int i = 0; i<values.size();i++){ 
      if(values.get(i).equals(obs)){ 
       frequencies.set(i, new Integer((int)frequencies.get(i)+1)); 
       return;//added 
      } 
     } 
     // only gets here if value of obs is not found 
     values.add(obs); 
     frequencies.add(new Integer(1)); 
    } 
} 

但是,因爲我會用這個可能是非常大的數據集,我想優化我的代碼,並使用frequencies.set(i, new Integer((int)frequencies.get(i)+1));似乎並不十分有效。

這使我想到我的問題;我如何優化ArrayListInteger值的更新?

+0

「看起來效率不高」似乎並不像您所描述的那樣。 –

+3

你應該使用地圖。但即使有兩個列表,通過使用indexOf而不是迭代自己,您的代碼可以變得更簡單。空列表案例和「不在列表中的值」案例也可以組合在一起。 –

+0

您正在重新實現所謂的multiset。嘗試找到它的實現並使用它。 – jmg

回答

13

使用HashMap<String,Integer>

創建像這樣

HashMap<String,Integer> hm = new HashMap<String,Integer>(); 

HashMap中那麼你addObservation方法看起來就像

public void addObservation(String obs) { 
    if(hm.contains(obs)) 
     hm.put(obs, hm.get(obs)+1); 
    else 
     hm.put(obs, 1); 
} 
+0

謝謝!我非常專注於使用ArrayLists,我沒有弄清楚可能有更適合於此目的的類。 – Maza89

+1

+1,非常好,很容易理解。另外,如果要按順序顯示數據集,使用TreeMap。 – Naved

0

我會用一個HashMap或一個Hashtable作爲tskzzy建議。根據您的需要,我還會創建一個名稱,計數以及您可能需要的其他元數據的對象。

因此,代碼會是這樣的:

Hashtable<String, FrequencyStatistics> statHash = new Hashtable<String, FrequencyStatistics>(); 
for (String value : values) { 
    if (statHash.get(value) == null) { 
     FrequencyStatistics newStat = new FrequencyStatistics(value); 
     statHash.set(value, newStat); 
    } else { 
     statHash.get(value).incrementCount(); 
    } 
} 

現在,您FrequencyStatistics對象的構造函數將自動設置其inital數爲1,而incrementCound()方法會增加計數,並執行任何其他統計你可能需要的計算。這在未來比使用相應的Integer存儲String的哈希還要更具可擴展性。

+1

我認爲,僅僅爲了保持頻率計數而創建一個對象會有點昂貴。 – Naved

+0

同意,但這取決於其他要求,以及是否還需要生成其他統計信息。 –