2015-10-20 19 views
1

以下是我的要求:我必須計算列表中特定項目的出現次數,然後將項目與其出現次數一起打印出來。爲此,我有以下代碼:如何在java中的Map中獲取重複鍵的最新值?

public void countOccurrences(Collection<String> list){ 
     Map<String, Integer> occurrenceMap = new HashMap<String, Integer>(); 

     for(String obj: list){ 
      Integer numOccurrence = occurrenceMap.get(obj); 
      if(numOccurrence == null){ 
       //first count 
       occurrenceMap.put(obj, 1); 
      } else{ 
       occurrenceMap.put(obj, numOccurrence++); 

      } 
     } 
     for (Map.Entry<String, Integer> entry : occurrenceMap.entrySet()) { 
      System.out.println(entry.getKey()+" : "+entry.getValue()); 
    } 
    } 

現在說的加入到我的列表示例項目如下:

list.add("apple"); 
list.add("apple"); 
list.add("apple"); 
list.add("banana"); 
list.add("banana"); 
list.add("mango"); 

,我很期待的輸出是

apple:3 
banana:2 
mango:1 

但是,即將到來的輸出是

apple:1 
banana:1 
mango:1 

我在這裏錯過了什麼?

+2

嘗試++ numOccurence而不是 – u6f6o

+0

'* ++'在*分配之後增加'x' *,而不是之前。 –

回答

1

我認爲你需要改變

occurrenceMap.put(obj, numOccurrence++);

occurrenceMap.put(obj, numOccurrence + 1);occurrenceMap.put(obj, ++numOccurrence);

numOccurrence++會後聲明將增加numOccurrence。它將永遠不會被使用,因爲numOccurrence在下一次循環執行時被重新分配。

2

你需要改變你的其他部分的邏輯

occurrenceMap.put(obj, ++numOccurrence); 

由於後增量

numOccurrence ++ 

返回numOccurrence值,然後遞增1 numOccurrence的價值因此你不要把最新的一個放在地圖上。

+0

非常感謝!這是一個很愚蠢的錯誤:P – user1278265

0

你可以這樣試試:

List<String> list = new ArrayList<String>(); 
list.add("apple"); 
list.add("apple"); 
list.add("apple"); 
list.add("banana"); 
list.add("banana"); 
list.add("mango"); 

Set<String> unique = new HashSet<String>(list); 
for (String key : unique) { 
System.out.println(key + ": " + Collections.frequency(list, key)); 
} 

輸出:

banana: 2 
apple: 3 
mango: 1 
0

你也可以用下面這段代碼來實現你的目標。

public static void countOccurrences(Collection<String> list){ 
    Map<String, Integer> occurrenceMap = new HashMap<String, Integer>(); 
    Integer temp; 
    for(String obj: list){ 
     if((temp = occurrenceMap.put(obj, 1))!= null){ 
      occurrenceMap.put(obj, ++temp); 
     } 
    } 
    for (Map.Entry<String, Integer> entry : occurrenceMap.entrySet()) { 
     System.out.println(entry.getKey()+" : "+entry.getValue()); 
    } 
} 
相關問題