按流计算出现次数

时间:2018-02-02 10:20:35

标签: java list collections stream hashmap

LinkedList<Double> list = new LinkedList<Double>();
list.add(9.5);
list.add(4.9);
list.add(3.2);
list.add(4.9);

我想通过流计算列表中的重复元素,并将它们放入HashMap,表示列表中每个数字的出现: 例如:(9.5 = 1,4.9 = 2,3.2 = 1) 有谁知道这是如何工作的。提前谢谢。

1 个答案:

答案 0 :(得分:1)

使用Collections.frequency

列出所有不同的值,并为每个值使用Collections.frequency方法计算它们的出现次数。然后收集到Map

Map<Double, Integer> result = list.stream()
        .distinct()
        .collect(Collectors.toMap(
            Function.identity(),
            v -> Collections.frequency(list, v))
        );

使用Collectors.groupingBy

我认为它不如上面的例子那么好。

Map<Double, Integer> result2 = list.stream()
    .collect(Collectors.groupingBy(Function.identity())) // this makes {3.2=[3.2], 9.5=[9.5], 4.9=[4.9, 4.9]}
    .entrySet().stream()
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        e -> e.getValue().size())
    );

普通for loop

plain for循环很短,你可能不需要stream和lambdas

Map<Double, Integer> map = new HashMap<>();
for(Double d : list)
  map.put(d, map.containsKey(d) ? map.get(d)+1 : 1);

使用forEach

使用forEach更短

Map<Double, Integer> map = new HashMap<>();
list.forEach(d -> map.put(d, map.containsKey(d) ? map.get(d)+1 : 1));