代码之家  ›  专栏  ›  技术社区  ›  Sorter

从map<object,set<object>>转换为map<string,set<string>>

  •  1
  • Sorter  · 技术社区  · 7 年前

    我有一张地图 Map<String, Set<String>>

    Map<String, Set<String> result = map.entrySet().parallelStream().collect(
                Collectors.groupingBy(Map.Entry::getValue, Collectors.mapping(Map.Entry::getKey, Collectors.toSet())));
    

    我想把它转换成 映射字符串,设置字符串 . 通过对值进行分组并交换键和值的位置。

    但这句话给了我

    Type mismatch: cannot convert from Map<Object,Set<Object>> to Map<String,Set<String>>

    3 回复  |  直到 7 年前
        1
  •  3
  •   Andy Turner    7 年前

    这里的问题是您要创建的地图类型是:

    Map<Set<String>, Set<String>>
    

    Map<String, Set<String>> .

    因此,您需要首先展开地图的值,例如:

    Map<String, Set<String>> collect = map.entrySet()
        .parallelStream()
        // Expand (k, {v1, v2, v3}) to [(v1, k), (v2, k), (v3, k)]
        .flatMap(e -> e.getValue().stream().map(ee -> new SimpleEntry<>(ee, e.getKey())))
        .collect(
            Collectors.groupingBy(
                Map.Entry::getKey,
                Collectors.mapping(Map.Entry::getValue, Collectors.toSet())));
    

    除非你 真正地 需要并行处理,我认为使用循环更容易:

    Map<String, Set<String>> collect = new HashSet<>();
    for (Map.Entry<String, Set<String>> entry : map.entrySet()) {
      for (String v : entry.values()) {
          collect.computeIfAbsent(v -> new HashSet<>())
                  .add(entry.getKey()));
      }
    }
    
        2
  •  1
  •   user10367961    7 年前

    下面是一个例子,考虑到您的初始映射是对象到对象。根据需要进行调整。

    Map<Object,Object> map = new HashMap<>();
    Map<String, Set<String>> result = map
                .entrySet()
                .parallelStream()
                .collect(Collectors.groupingBy(entry -> (String) entry.getKey(), 
                         Collectors.mapping(entry -> (String) entry.getKey(), Collectors.toSet())));
    

    你的代码的问题是 Map.Entry::getKey 返回一个对象,而不是字符串。

        3
  •  1
  •   Sorter    7 年前

    为了避免混淆,我在回答我的问题。感谢@andyturner@alexrolea指出解决方案。

    Map<Set<String>, Set<String>> result = map.entrySet().parallelStream()
                    .collect(
                    Collectors.groupingBy(entry -> (Set<String>) entry.getValue(), 
                            Collectors.mapping(entry -> entry.getKey(), Collectors.toSet())));
    

    我得换掉 Map.Entry::getValue 具有 entry -> (Set<String>) entry.getValue() 另一个也是。

    这帮助我按值对映射进行分组,并将它们用作键。谢谢@nullpointer

    事实上,这也是可行的。问题是我没有返回正确的数据类型。

    Map<Set<String>, Set<String>> result = map.entrySet().parallelStream()
                    .collect(
                    Collectors.groupingBy(Map.Entry::getValue, 
                            Collectors.mapping(Map.Entry::getKey, Collectors.toSet())));
    
    推荐文章