gpt4 book ai didi

java - groupingBy 具有多个键的分类器

转载 作者:搜寻专家 更新时间:2023-11-01 02:39:14 29 4
gpt4 key购买 nike

我有一个 List<Set<Integer>>想要一个 Map<Integer, List<Set<Integer>>>这将映射每个 Integer所有 sets包含 Integer .

这里明显的候选者是使用 Collectors.groupingBy但它不起作用,因为 groupingBy只允许返回一个键的分类器函数。我需要为每个 Set 返回几个键.

List<Set<Integer>> setList ...;
Map<Integer, List<Set<Integer>>> setMap = setList.stream().collect(
groupingBy(eachSet -> ))

这是我想在不使用流的情况下实现的一个示例:

List<Set<Integer>> setList ...
System.out.print("setList: ");
System.out.println(setList);

Map<Integer, List<Set<Integer>>> setMap = new HashMap<>();
for(Set<Integer> eachSet: setList) {
for(Integer i: eachSet) {
List<Set<Integer>> newSetList = setMap.getOrDefault(i, new ArrayList<>());
newSetList.add(eachSet);
setMap.putIfAbsent(i, newSetList);
}
}
System.out.print("setMap: ");
System.out.println(setMap);

这将输出以下内容:

setList: [[1], [1], [1, 3], [2, 3, 7]]
setMap: {1=[[1], [1], [1, 3]], 2=[[2, 3, 7]], 3=[[1, 3], [2, 3, 7]], 7=[[2, 3, 7]]}

最佳答案

两种方法:

创建所有集合中所有整数的流,然后将一个整数与包含它的所有集合相关联。

    Map<Integer, List<Set<Integer>>> m1 =
list.stream().flatMap(Set::stream)
.distinct()
.collect(
Collectors.toMap(a -> a,
b -> list.stream().filter(set -> set.contains(b)).collect(Collectors.toList()))
);

创建一个中间映射,将集合的元素映射到自身,然后将这些条目合并到最终映射中。

    Map<Integer, List<Set<Integer>>> m2 = list.stream()
.map(x -> x.stream().collect(Collectors.toMap(a -> a, b -> x)))
.flatMap(x -> x.entrySet().stream())
.collect(
Collectors.toMap(Map.Entry::getKey,
a -> List.of(a.getValue()), (l1, l2) -> Stream.concat(l1.stream(), l2.stream()).collect(Collectors.toList()))
);

关于java - groupingBy 具有多个键的分类器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38346358/

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