- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 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/
有没有一种方法可以简化它并直接将从 groupingBy 获得的映射转换为具有键和值作为属性的元素列表?而不是有 2 倍的转换流。 我在这里做的是获取 RiskItems,然后将它们映射到 DTO,之
我面临一个棘手的情况,我必须在具有嵌套列表的对象上使用 groupingBy。我用 map()、flatmap()、toMap() 尝试了一些东西,但无法想出一个解决方案,只是在兜圈子。非常感谢来自流
我想知道流(或收集器)中是否已经实现了将列表排序为值的功能。例如。以下代码都生成按性别分组的人员列表,并按年龄排序。第一个解决方案有一些开销排序(并且看起来有点邋遢)。第二种解决方案需要对每个人进行两
这个问题在这里已经有了答案: Java 8 is not maintaining the order while grouping (2 个答案) Stream doesn't preserve t
我有一个 List>想要一个 Map>>这将映射每个 Integer所有 sets包含 Integer . 这里明显的候选者是使用 Collectors.groupingBy但它不起作用,因为 gro
我想知道,流(或收集器)中是否已经实现了将列表排序为值的功能。例如。以下代码均生成按年龄排序的按性别分组的人员列表。第一个解决方案有一些开销排序(看起来有点邋遢)。第二种解决方案需要对每个人进行两次检
我正在尝试做的一个简化示例: 假设我有一个字符串列表,需要根据是否包含特定子字符串的条件将其分为 4 组。如果一个字符串包含 Foo 它应该属于 FOO 组,如果它包含 Bar 它应该属于 BAR 组
我想通过基于 LocalDateTime 的集合进行分组,但我只想获取小时,而不是分钟、秒... .collect(Collectors.groupingBy(cp -> getUpdateLocal
我有一个Employee类: public class Employee { public enum Sex { MALE, FEMALE } private
考虑this SO answer 我有几个问题: 它是如何运作的?是groupingBy()检查返回值是否来自classifier是 List并比较每一项?对我来说,这听起来不像是典型的 Java 函
我有一个College具有嵌套静态类的类 Dept 学院 class College { private String collegeName; private Dept dept; public D
编译器在这里给了我一个非静态方法错误,我已经知道这并不意味着它一定是问题,但我真的找不到其他任何东西,特别是因为我在不同的类中有相同的方法对于通行证来说,一切正常。 public Map> setup
我有一个Employee类: public class Employee { public enum Sex { MALE, FEMALE } private
考虑this SO answer 我有几个问题: 它是如何运作的?是groupingBy()检查返回值是否来自classifier是 List并比较每一项?对我来说,这听起来不像是典型的 Java 函
我有一个类,假设 CheeseMojo 具有以下各种字段: public class CheeseMojo { private String recipies = "Recipies";
tl/dr:Kotlin 如何使用 groupingBy 和聚合来获得(键,数字)对的序列以求和到计数映射? 我有 30gb 的 csv 文件,可以轻松阅读和解析。 File("data").walk
我有一个 Employee 的列表 public class Employee { private String name; private Integer age; private Do
我有一个类叫做 Food : public class Food { private Collection foodToFoodGroups; //getters and setter
假设我有一个国家/地区对象列表,其中包含该国家/地区使用的语言列表,如下所示: class Country { List languages; } 我想创建以下格式的 map : Map> ,
给定一个 TimeEntry 对象列表,我想将它们分组为 Day 和 Hour 对象。 其中 Day 有 Hour 对象的列表,而 Hour 有其代表的小时的 TimeEntry 对象的列表。 Day
我是一名优秀的程序员,十分优秀!