2013-08-07 13 views
2

給定一個可能包含重複項的列表(如下所示),我需要能夠統計每個(關鍵字)編號獨特的元素。使用Java的內建Set類對列表中的列表值中的每個(關鍵字)唯一元素進行計數

List<String> list = new ArrayList<String>(); 
Set<String> set = new HashSet<String>(); 
list.add("M1"); 
list.add("M1"); 
list.add("M2"); 
list.add("M3"); 

set.addAll(list); 
System.out.println(set.size()); 

如何從列表中獲得每個唯一元素的計數? 這意味着,我想知道有多少「M1」包含列表(列表),有多少「M2」等

The result should be the following: 
2 M1 
1 M2 
1 M3 
+1

建議編輯的問題標題:「如何計算中的項目出現的次數一個列表?」或類似的規定。 – Rob

回答

2

我認爲你正在尋找這樣的事情(我沒編譯它,但它應該讓你在正確的方向前進):

List<String> list = ArrayList<>(); 
Map<String, Integer> counts = new HashMap<>(); 
// Fill list with values.... 

for (String item:list) { 
    Integer count = counts.get(item); 
    if (count == null) { 
     // This is the first time we have seen item, so the count should be one. 
     count = 1; 
    } else { 
     // Increment the count by one. 
     count = count + 1; 
    } 
    counts.put(item, count); 
} 

// Print them all out. 
for (Entry<String, Integer> entry : counts.entrySet()) { 
    System.out.println(entry.getValue() + " " + entry.getKey()); 
} 
5

您正在尋找Map<String, Integer>數據結構,而不是Set

喜歡的東西

for(iterating over something){ 
    Integer count =map.get(value); 
    if(count == null){ 
      map.put(value, 1); 


    } else{ 
     count++; 
     map.put(value, count); 
    } 

} 

地圖是數據結構映射唯一重視

+0

我如何計算地圖?或者在Map中添加相同的值? 我以前從未使用Map。) –

+0

請參閱編輯回答 –

+0

我建議重構代碼,以便每個循環只調用一次map.get()。 – Rob

2

Set不會幫助你在日是的情況下,你需要一張地圖:

List<String> list = new ArrayList<String>(); 
Set<String> set = new HashSet<String>(); 
list.add("M1"); 
list.add("M1"); 
list.add("M2"); 
list.add("M3"); 

// ... 

Map<String, Integer> counts = new HashMap<String, Integer>(); 
for(String element: list) { 
    int currentCount; 
    if(counts.contains(element)) { 
     currentCount = counts.get(element) + 1; 
    } else { 
     currentCount = 1; 
    } 
    counts.put(element, currentCount); 
} 

// ... 

for(String element: counts.keySet()) { 
    System.out.println("element: " + element + ", times appeared: " + counts.get(element)); 
} 
+0

我建議重構此代碼不要在同一個迭代中調用contains()和get()。此外,作爲寫入的代碼重複計數,不包括每個項目出現在列表中的次數 - put(element,0)應該被放置(element,1)。 – Rob

+0

此外,您的打印循環不需要調用get() - 只需迭代entrySet()。獲得/包含的/ etc。速度相當快,但不是免費的。 – Rob

+0

@Rob關於你的第一條評論:全部有效,修正。關於你的第二個評論:實際上調用了get()。 – morgano

0

意味着你想知道「M1」有多少列表包含(列表),有多少「M2」,而不是使用設置接口,您可以使用地圖接口,因爲地圖包含鍵,值對格式,即地圖數據結構。

Map<key,Value> 
+0

這個答案沒有說明要在地圖上放什麼。關於如何使用Map來解決這個問題的更多細節會使這個更有用的答案。 – Rob

0

更爲簡單的方法:用Collections.frequency()

System.out.println("M2: "+Collections.frequency(list,"M2");

將輸出

M2: 1

相關問題