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

2022-09-01 09:30:25

给定一个具有可能重复的对象集合,我希望最终获得每个对象的出现次数。我通过初始化一个空的,然后循环访问对象并将其映射到其计数(每次映射已经包含对象时递增计数)来做到这一点。MapCollection

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语言特定的功能持开放态度,这些功能允许更短的代码。


答案 1

看看番石榴的多套。几乎正是您正在寻找的。

不幸的是,它没有addAll(Iterable iterable)函数,但是在集合上调用add(E e)的简单循环很容易。

编辑

我的错误,它确实有一个addAll方法 - 因为它必须,因为它实现了Collection。


答案 2

现在让我们尝试一些Java 8代码:

static public Map<String, Integer> toMap(List<String> lst) {
    return lst.stream()
            .collect(HashMap<String, Integer>::new,
                    (map, str) -> {
                        if (!map.containsKey(str)) {
                            map.put(str, 1);
                        } else {
                            map.put(str, map.get(str) + 1);
                        }
                    },
                    HashMap<String, Integer>::putAll);
}
static public Map<String, Integer> toMap(List<String> lst) {
    return lst.stream().collect(Collectors.groupingBy(s -> s,
                                  Collectors.counting()));
}

我认为这个代码更优雅。


推荐