如何在Java中反转列表的hashmap?

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作为值.

Tit*_*tus 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()})));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Pie*_*and 5

使用流:

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)

说明:

  1. 由于有多个值,它为附加到给定 Object1 的每个值创建一个元组:

    e -> e.getValue().stream().map(o2 -> Pair.of(o2, e.getKey()))

  2. flatMap(...) 允许将一个条目转换为结果流中的 0 个或多个项目

  3. 将值 Object1 映射到一个集合

    Collectors.mapping(Pair::getValue, Collectors.toSet())

  4. 最终容器创建:

    哈希映射::新

  5. 在 pair.getKey() 中按 Object2 分组,它将组提供给 (3) 中描述的映射:

    Collectors.groupingBy(Pair::getKey, HashMap::new, Collectors.mapping(...))