计算列表中字符串的出现次数,然后对结果进行排序 - Java 8

AMa*_*gic 4 java sorting java-8 java-stream collectors

我看到这种“计数出现次数和排序”类型的问题有很多风格(最接近的相关问题是this),但它们都不适用于我的情况。

这是我的代码。

List<Employee> employees = new ArrayList<>();

Employee e1 = new Employee;
e1.setFirstName("Beth");

Employee e2 = new Employee;
e1.setFirstName("Beth");

Employee e3 = new Employee;
e1.setFirstName("Andrew");

// similarly I'm creating millions of employees and adding them to my list below 

employees.add(e1);
employees.add(e2);
employees.add(e3);
employees.add(e53456667);

//count occurrences of first names
Map<String, Long> employeeFirstNameCount = employees.stream()
                .collect(Collectors.groupingBy(p -> p.getFirstName(), Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)

这导致

{Beth=2, Andrew=34674, Charles=2388491, John=223545, Alex=2345562}
Run Code Online (Sandbox Code Playgroud)

但我需要它作为

{Alex=2345562, Andrew=34674, Beth=2, Charles=2388491, John=223545}
Run Code Online (Sandbox Code Playgroud)

我尝试过这个(参考):

Map<String, Long> employeeFirstNameCount = employees.stream()
        .collect(Collectors.groupingBy(p -> p.getFirstName(), Collectors.counting()))
        .entrySet().stream()
        .sorted(Map.Entry.<String, Long> comparingByValue(Comparator.naturalOrder()).thenComparing(Map.Entry.comparingByKey()))
        .limit(20)
        .map(Map.Entry::getKey)
        .collect(toList());
Run Code Online (Sandbox Code Playgroud)

但出现这个错误

在此输入图像描述

现在我一无所知。有人可以帮忙吗?

DSa*_*oBC 5

如果您在创建时使用 aTreeMap而不是默认值,则可以获得所需的输出,如下所示:HashMapMap

Map<String, Long> employeeFirstNameCount = employees.stream()
            .collect(Collectors.groupingBy(Employee::getFirstName,
                                           TreeMap::new,
                                           Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)

使用java.util.TreeMap其键的自然顺序(这足以满足您的需要),或者您可以提供自定义Comparator

请注意,我使用 lambda 表达式Employee::getFirstName而不是p -> p.getFirstName(),但两者产生相同的结果。