如何在java中的Map中获取重复键的最新值?

时间:2015-10-20 09:24:09

标签: java collections

以下是我的要求:我必须计算列表中特定项目的出现次数,然后打印该项目及其出现次数。为此,我有以下代码:

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

我在这里缺少什么?

4 个答案:

答案 0 :(得分:2)

您需要更改其他部分的逻辑

 occurrenceMap.put(obj, ++numOccurrence);

因为后期增量

numOccurrence ++ 

返回numOccurrence的值,然后将numOccurrence的值增加1.因此,您不会将最新的值增加到地图中。

答案 1 :(得分:1)

我认为你需要改变

occurrenceMap.put(obj, numOccurrence++);

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

numOccurrence++将在声明后增加numOccurrence。它将永远不会被使用,因为numOccurrence在下次循环时被重新分配。

答案 2 :(得分: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

答案 3 :(得分:0)

您还可以使用以下代码来实现您的目标。

{{1}}