java 按流计数出现次数

izj3ouym  于 2023-01-24  发布在  Java
关注(0)|答案(2)|浏览(134)
LinkedList<Double> list = new LinkedList<Double>();
list.add(9.5);
list.add(4.9);
list.add(3.2);
list.add(4.9);

我想通过一个流来计算列表中重复的元素,并将它们放入一个HashMap中,HashMap表示列表中每个数字的出现次数:例如:(9.5=1,4.9=2,3.2=1)有人知道这是怎么工作的吗?

sulc1iza

sulc1iza1#

使用Collections.frequency

创建一个所有非重复值的列表,并使用Collections.frequency方法计算每个值的出现次数。

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

简单的for循环相当短,可能不需要流和lambda

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));
ctehm74n

ctehm74n2#

另一种方法是使用不需要distinct的Collectors.counting

Map<Double, Long> frequencies = list.stream()
  .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

相关问题