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

时间:2016-05-22 09:27:15

标签: java arraylist hashmap

我有一个带有对象键的hashmap和另一个对象的arraylist作为值:

HashMap<Object1, ArrayList<Object2>> map;

Object2可以属于多个Object1。我想扭转它,使它成为:

HashMap<Object2, ArrayList<Object1>> reversed;

我该怎么做?

我已经看到了带有对象键和对象值的哈希映射的解决方案,但不同的是,我的问题围绕一个arraylist作为值。

2 个答案:

答案 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())));

说明:

  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. 由pair2.getKey()中的Object2进行分组,该分组将组提供给(3)中所述的映射:

      

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