我想要將某個變量的所有值存儲在數據集中,以及每個值的頻率。爲此,我使用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));
似乎並不十分有效。
這使我想到我的問題;我如何優化ArrayList
中Integer
值的更新?
「看起來效率不高」似乎並不像您所描述的那樣。 –
你應該使用地圖。但即使有兩個列表,通過使用indexOf而不是迭代自己,您的代碼可以變得更簡單。空列表案例和「不在列表中的值」案例也可以組合在一起。 –
您正在重新實現所謂的multiset。嘗試找到它的實現並使用它。 – jmg