繁体   English   中英

如何在Java中反转列表的哈希图?

[英]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())));

说明:

  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. 最终容器创建:

    HashMap :: new

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM