[英]How to reverse a hashmap of list in Java?
我有一个带有对象键和另一个对象的数组列表作为值的哈希图:
HashMap<Object1, ArrayList<Object2>> map;
一个对象2可以属于多个对象1。 我想扭转它,以便成为:
HashMap<Object2, ArrayList<Object1>> reversed;
我怎样才能做到这一点?
我已经看到了带有对象键和对象值的哈希映射的解决方案,但是不同的是,我的问题围绕着数组列表作为值。
您可以执行以下操作:
HashMap<Object2, ArrayList<Object1>> reversed = new HashMap<>();
for(Map.Entry<Object1, ArrayList<Object2>> entry : map.entrySet()){
List<Object2> list = entry.getValue();
for(Object2 obj : list){
if(reversed.containsKey(obj)){
reversed.get(obj).add(entry.getKey());
}else{
reversed.put(obj, new ArrayList<Object1>(Arrays.asList(new Object1[]{entry.getKey()})));
}
}
}
使用流:
Map<Object2, Set<Object1>> reversed = map.entrySet().stream()
.flatMap(e -> e.getValue().stream().map(o2 -> Pair.of(o2, e.getKey())))
.collect(Collectors.groupingBy(Pair::getKey, HashMap::new, Collectors.mapping(Pair::getValue, Collectors.toSet())));
说明:
由于存在多个值,因此它将为附加到给定Object1的每个值创建一个元组:
e-> e.getValue()。stream()。map(o2-> Pair.of(o2,e.getKey()))
flatMap(...)允许将一个条目转换为结果流上的0个或多个项目
将值Object1映射到集合
Collectors.mapping(Pair :: getValue,Collectors.toSet())
最终容器创建:
HashMap :: new
在pair.getKey()中按Object2进行分组,该分组将组提供给(3)中描述的映射:
Collectors.groupingBy(Pair :: getKey,HashMap :: new,Collectors.mapping(...))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.