dav*_*o12 1 java arraylist hashmap
我有一个带有对象键的hashmap和另一个对象的arraylist作为值:
HashMap<Object1, ArrayList<Object2>> map;
Run Code Online (Sandbox Code Playgroud)
Object2可以属于多个Object1.我想扭转它,使它成为:
HashMap<Object2, ArrayList<Object1>> reversed;
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我已经看到了具有对象键和对象值的哈希映射的解决方案,但不同的是,我的问题围绕一个arraylist作为值.
你可以这样做:
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()})));
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用流:
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())));
Run Code Online (Sandbox Code Playgroud)
说明:
由于有多个值,它为附加到给定 Object1 的每个值创建一个元组:
e -> e.getValue().stream().map(o2 -> Pair.of(o2, e.getKey()))
flatMap(...) 允许将一个条目转换为结果流中的 0 个或多个项目
将值 Object1 映射到一个集合
Collectors.mapping(Pair::getValue, Collectors.toSet())
最终容器创建:
哈希映射::新
在 pair.getKey() 中按 Object2 分组,它将组提供给 (3) 中描述的映射:
Collectors.groupingBy(Pair::getKey, HashMap::new, Collectors.mapping(...))