Map <string,list <string>的Collectors.groupby

时间:2018-12-31 11:30:22

标签: java java-8 java-stream collectors

如果解决方案很明显,请原谅我,但我似乎不知道该怎么做

public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("b1", "a1");
    map.put("b2", "a2");
    map.put("b3", "a1");
    Map<String, List<String>> mm = map.values().stream().collect(Collectors.groupingBy(m -> m));
    System.out.println(mm);
}

我想基于哈希图中的值进行分组。我希望输出为{a1=[b1, b3], a2=[b2]},但当前为{a1=[a1, a1], a2=[a2]}

3 个答案:

答案 0 :(得分:6)

当前,您正在流式传输地图值(我认为是一个错字),根据您需要的输出,您应该流过地图entrySet并根据地图值的使用groupingBymapping作为基于地图关键字的下游收集器:

 Map<String, List<String>> result = map.entrySet()
            .stream()
            .collect(Collectors.groupingBy(Map.Entry::getValue,
                          Collectors.mapping(Map.Entry::getKey, 
                                        Collectors.toList())));

您还可以通过forEach + computeIfAbsent在没有流的情况下执行此逻辑:

Map<String, List<String>> result = new HashMap<>();
map.forEach((k, v) -> result.computeIfAbsent(v, x -> new ArrayList<>()).add(k));

答案 1 :(得分:4)

您可以在地图entrySet上将Collectors.mappingCollectors.groupingBy一起使用:

Map<String, List<String>> mm = map.entrySet()
        .stream()
        .collect(Collectors.groupingBy(Map.Entry::getValue, 
                Collectors.mapping(Map.Entry::getKey, Collectors.toList())));
  

但它当前以{a1 = [a1,a1],a2 = [a2]}

出现

那是因为您当前正在对仅{a1, a2, a1}的值集合进行分组。

答案 2 :(得分:0)

globals: {
    window: 'writable'
  },