以下是我的要求:我必须计算列表中特定项目的出现次数,然后打印该项目及其出现次数。为此,我有以下代码:
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
我在这里缺少什么?
答案 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}}