我有一个带有对象键的hashmap和另一个对象的arraylist作为值:
HashMap<Object1, ArrayList<Object2>> map;
Object2可以属于多个Object1。我想扭转它,使它成为:
HashMap<Object2, ArrayList<Object1>> reversed;
我该怎么做?
我已经看到了带有对象键和对象值的哈希映射的解决方案,但不同的是,我的问题围绕一个arraylist作为值。
答案 0 :(得分:5)
您可以这样做:
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()})));
}
}
}
答案 1 :(得分:2)
使用流:
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
由pair2.getKey()中的Object2进行分组,该分组将组提供给(3)中所述的映射:
Collectors.groupingBy(Pair :: getKey,HashMap :: new,Collectors.mapping(...))