【问题标题】:Collectors.groupby for Map<String,List<String>用于 Map<String,List<String> 的 Collectors.groupby
【发布时间】:2019-05-27 22:56:37
【问题描述】:

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

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

我想根据 hashmap 中的值进行分组。我希望输出为{a1=[b1, b3], a2=[b2]},但它目前为{a1=[a1, a1], a2=[a2]}

【问题讨论】:

    标签: java java-8 java-stream collectors


    【解决方案1】:
    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
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您可以在地图的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} 的值集合进行分组。

        【讨论】:

        • collect 读取为groupBy 值,同时将它们对应的键映射到List
        猜你喜欢
        • 2020-08-01
        • 1970-01-01
        • 2018-09-22
        • 2020-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-01
        • 1970-01-01
        相关资源
        最近更新 更多