Java集合中计算出现次数的优雅方法

32

给定一组可能包含重复元素的对象集合,我想得到每个对象出现次数的计数。我通过初始化一个空的 Map,然后遍历 Collection 并将对象映射到其计数(每次在 map 中已经包含该对象时递增计数)来实现此目标。

public Map<Object, Integer> countOccurrences(Collection<Object> list) {
    Map<Object, Integer> occurrenceMap = new HashMap<Object, Integer>();
    for (Object obj : list) {
        Integer numOccurrence = occurrenceMap.get(obj);
        if (numOccurrence == null) {
            //first count
            occurrenceMap.put(obj, 1);
        } else {
            occurrenceMap.put(obj, numOccurrence++);
        }
    }
    return occurrenceMap;
}

这看起来对于简单的计算出现次数逻辑来说太啰嗦了。有没有更优雅/更短的方法来完成这个任务?我可以考虑完全不同的算法或允许更短代码的Java语言特定功能。


6
统计出现次数并不是那么简单,你的代码似乎是你能做到的最好的。 - Henry
1
为了获得所有元素发生的完整列表,你必须遍历整个集合,我认为你的实现是不错的。 - hovanessyan
1
你为什么认为这是啰嗦的?在我看来很清晰。这就是Java的样子。 - Joe
2
@DariuszWawer 无论如何都只有一次迭代,排序在这里不会有任何影响。 - NimChimpsky
1
这段代码有错误。 else 语句中应该是 ++numOccurrence,否则我们会用1覆盖出现次数。 - Jernej Jerin
显示剩余5条评论
12个回答

0

commons-collections 中有一个方法:CollectionUtils.getCardinalityMap,它可以做到这一点。


-1

Java是一种冗长的语言,我认为除非使用第三方库或等待Java 8的Lambda表达式,否则没有更简单的方法来实现它。


相比于 Ruby、Python、Perl、Scala、C# 等,有很大的区别。 - Hui Zheng
有人能给我一个踩这个答案的理由吗?被接受的答案使用了第三方库吗?仅仅因为我说Java很啰嗦?多么有趣啊。 - Hui Zheng
我认为这至少是有争议的,因此会引起这样的回应。 - Brian Agnew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接