2011-07-25 85 views
2

我是新來的java和在java中開發一個小應用程序,現在我堅持一個點。我有一個名爲Candidate的自定義類。它看起來像:如何計算陣列/列表中特定元素的發生次數

============================= 
|Candidate Class   | 
============================= 
|Private Members:   | 
|Node Array     | 
|IsValid Bool    | 
----------------------------- 
|Public Methods:   | 
|AddCandidateNode   | 
|SetIsValid     | 
|ComparisonOperatorOverloaded| 
============================= 

現在我有所有候選人的數組包含列表,我想知道,陣列中的每個候選的發生頻率。我想到的一種方法是編寫兩個循環,並使用重載方法進行比較。但我不想使用它。所以我只是想順從那是否有任何內置的方法爲我做了同樣的事情?

+1

您可以發佈您的Java代碼? – mschonaker

回答

7

這是一個經典問題。解決方案是使用一個映射,其中鍵是數組中的項,值是計數。

在僞碼關閉到Java看起來像這樣的代碼:

Map<Candidate, Integer> map = new HashMap<Candidate, Integer>(); 
for (Candidate c: Candidates) { 
    if (map.containsKey(c)) { 
     map.put(c, map.get(c) + 1); 
    } else { 
     map.put(c, 1); 
    } 
} 

運行後,這個計數就會在地圖上。

1

我想沒有其他方法可以循環使用ArrayList

我會告訴你,我寫的有關該方案很久以前:)

假設你已經實現了Candidatehashcode()equals()功能一個簡單的方法。

HashMap<Candidate,Integer> counter = new HashMap<Candidate,Integer>(); 

for(Candidate can : andidateArray){ 
    if(counter.get(can) == null){ 
     counter.put(can,1); 
    }else{ 
     counter.put(can, counter.get(can) + 1); 
    } 
} 
3

還有一個更簡單的方法,如果你正在尋找一個特定元素的頻率:

final String[] fruits = { "apple", "orange", "pear", "apple" }; 
final List<String> fruitList = Arrays.asList(fruits); 
System.out.println(Collections.frequency(fruitList, "apple")); // Prints 2 
+0

Collection類中的這個API對我來說是新的。感謝分享 – Sreejesh

0

您可以使用guava'sMultiSet

Multiset<String> counter = HashMultiset.create(Arrays.asList("apple","apple","orange"));