有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用收集器。groupingBy具有哈希映射值

我最近开始学习Streams和Lambda表达式,但我的代码遇到了问题

我有一个名字列表,我想根据它们的长度和数量对它们进行分组,我必须使用收集器。groupingBy()两次:

public class StreamApplicationDemo {
    public static void main(String[] args) {

        List<String> names = new ArrayList<>
              (Arrays.asList("Amir", "Hatef","Mehran", "Mojtaba",
                    "Mohammad", "Ali", "Davood", "Reza", "Mohsen"));


        Map<Integer, List<String>> groupByLengthMap = names.
            stream().
                collect(Collectors.groupingBy(name -> name.length()));
        System.out.println(groupByLengthMap);


        Map<Integer, Long> groupByLengthNumberMap = names.
                  stream().
                  collect(Collectors.groupingBy(name -> name.length(), 
        Collectors.counting()));
              System.out.println(groupByLengthNumberMap);


    }
}

输出:

 {3=[Ali], 4=[Amir, Reza], 5=[Hatef], 6=[Mehran, Davood, Mohsen], 7=[Mojtaba], 8= 
 [Mohammad]}
 {3=1, 4=2, 5=1, 6=3, 7=1, 8=1}

如您所见,我使用Streams终端方法(Collect())按名称的长度对列表进行分组,然后我不得不另一次对列表进行分组,并根据名称的长度和编号对其进行映射。 但我想合并这两个分组,并这样做:

{3{1=[Ali]},4{2=[Amir,Reza]}…}

正如你所看到的,我想要一个以单词长度为键的地图,一个单词计数的地图,一个单词列表作为键的值:

地图<;整数,Map<;整数,列表>&燃气轮机

但是,我不知道如何仅通过使用Collect()和groupingBy()方法来实现这一点,该方法使用函数作为输入。有可能吗? 提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    试试这个

    public static void main(String[] args) {
        List<String> names = List.of("Amir", "Hatef", "Mehran", "Mojtaba",
            "Mohammad", "Ali", "Davood", "Reza", "Mohsen");
        Map<Integer, Map<Integer, List<String>>> result = names.stream()
            .collect(Collectors.groupingBy(String::length))
            .entrySet().stream()
            .collect(Collectors.toMap(Entry::getKey,
                e -> Map.of(e.getValue().size(), e.getValue())));
        System.out.println(result);
    }
    

    输出:

    {3={1=[Ali]}, 4={2=[Amir, Reza]}, 5={1=[Hatef]}, 6={3=[Mehran, Davood, Mohsen]}, 7={1=[Mojtaba]}, 8={1=[Mohammad]}}