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)
但出现这个错误
现在我一无所知。有人可以帮忙吗?
如果您在创建时使用 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(),但两者产生相同的结果。