gpt4 book ai didi

java - 如何计算带有集合的列表中的项目出现次数?

转载 作者:行者123 更新时间:2023-12-03 23:33:40 26 4
gpt4 key购买 nike

假设我有一个 List<Set<String>>看起来像这样:

[A,B,C,D]
[B,C,D,E]
[C,D,E,F]
[D,E,F,G]

如果我想在每个 Set<String> 中使用每个值(A、B、C、D、E、F、G)在那List<Set<String>>并通过映射它们来计算它们的出现,我实现它的好方法是什么?我想让输出看起来像:

A: 1
B: 2
C: 3
D: 4
E: 3
F: 2
G: 1

最佳答案

只需将列表扁平化为单个流并使用 groupingBy 收集器。

  • 首先,只需流式传输列表。这会创建一个较小列表的流。
  • 那么您需要流式传输这些内容。但是你不想要 4 个字母流。你想要一个 16 个字母的流(或所有集合的总和)。这就是 flatMap 所做的。它将多个流合并为一个。
  • 那么您想要进行频率计数。所以你想用它们自己作为键来对字母进行分组。默认情况下,groupingBy 会创建一个列表并将冲突(与重复键关联的值)放入列表中。
  • 但你不希望这样,所以 Collectors.counting() 说如果你看到另一个键已经存在,只需保持计数并将值更新 1。所以你计算键的出现次数。
List<Set<String>> list = List.of(Set.of("A", "B", "C", "D"),
Set.of("B", "C", "D", "E"),
Set.of("C", "D", "E", "F"),
Set.of("D", "E", "F", "G"));

Map<String, Long> freq =
list.stream().flatMap(Set::stream).collect(Collectors
.groupingBy(a -> a, Collectors.counting()));

freq.entrySet().forEach(System.out::println);

打印

A=1
B=2
C=3
D=4
E=3
F=2
G=1

这是一个默认 groupingBy 行为的简单示例。它只是将值除以 10 时的余数放在一个列表中。 IntStream 生成 int primitives 流,因此需要将它们转换为要收集的对象(本例中为 Integer)。

Map<Integer, List<Integer>> remainders =
IntStream.range(0, 100).mapToObj(Integer::valueOf)
.collect(Collectors.groupingBy(n -> n % 10));

remainders.entrySet().forEach(System.out::println);

打印

0=[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
1=[1, 11, 21, 31, 41, 51, 61, 71, 81, 91]
2=[2, 12, 22, 32, 42, 52, 62, 72, 82, 92]
3=[3, 13, 23, 33, 43, 53, 63, 73, 83, 93]
4=[4, 14, 24, 34, 44, 54, 64, 74, 84, 94]
5=[5, 15, 25, 35, 45, 55, 65, 75, 85, 95]
6=[6, 16, 26, 36, 46, 56, 66, 76, 86, 96]
7=[7, 17, 27, 37, 47, 57, 67, 77, 87, 97]
8=[8, 18, 28, 38, 48, 58, 68, 78, 88, 98]
9=[9, 19, 29, 39, 49, 59, 69, 79, 89, 99]

关于java - 如何计算带有集合的列表中的项目出现次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64851079/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com