繁体   English   中英

地图的 Collectors.groupby <String,List<String>

[英]Collectors.groupby for Map<String,List<String>

如果解决方案非常明显,请原谅我,但我似乎无法弄清楚如何做到这一点

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]}

目前,您正在流式传输地图值(我假设是一个拼写错误),根据您所需的输出,您应该在地图entrySet上流式传输,并根据地图值使用groupingBy并根据地图键mapping为下游收集器:

 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));

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

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}仅限于{a1, a2, a1}

public class Test5 {

    public static void main(String[] args) {

        List<String> list1 = List.of("Tabu", "Gina", "protijayi", "Gini", "Gini","North Calcutta");
        List<String> list2 = List.of("Soudipta", "Gina", "Gina", "upto");
        List<String> list3 = List.of("Soudipta", "Gina", "protijayi", "Tabu","South Calcutta");
        List<List<String>> listres = List.of(list1, list2, list3);
        System.out.println(listres);
/*
 [[Tabu, Gina, protijayi, Gini, Gini, North Calcutta], 
[Soudipta, Gina, Gina, upto],
 [Soudipta, Gina, protijayi, Tabu, South Calcutta]]

 */



        Map<String, List<Long>> FirstKeyThenValue1 = listres.stream().flatMap(
                // mapper

                list -> list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                        .entrySet().parallelStream()

        ).collect(Collectors.groupingBy(Entry::getKey, Collectors.mapping(
                // mapper, downstream

                Entry::getValue, Collectors.toList())));
        System.out.println("FirstKeyThenValue1  -> " + FirstKeyThenValue1);
        /*
         {
  upto=[1],
   Soudipta=[1, 1],
    Gina=[1, 2, 1], 
    Tabu=[1, 1],
     North Calcutta=[1], 
     South Calcutta=[1], 
     protijayi=[1, 1], 
     Gini=[2]}
         */

        Map<Long, List<String>> FirstValueThenkey1 = listres.stream().flatMap(
                // mapper

                list -> list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                        .entrySet().stream()

        ).collect(

                Collectors.groupingBy(Entry::getValue, Collectors.mapping(


                        Entry::getKey, Collectors.toList()

                ))

        );

        System.out.println(" FirstValueThenkey1 => " + FirstValueThenkey1);

        /*


  {
  1=[Gina, Tabu, North Calcutta, protijayi, upto, Soudipta,
   Soudipta, Gina, Tabu, South Calcutta, protijayi],

 2=[Gini, Gina]
 }
         */





    }// main
}

暂无
暂无

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

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