Vejo que há muitos sabores de este "ocorrências contagem e a classificação" tipo de perguntas (o mais próximo questão relacionada era este ), mas nenhum deles está trabalhando na minha situação.
Este é meu código.
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()));
Isto resulta em
{Beth=2, Andrew=34674, Charles=2388491, John=223545, Alex=2345562}
Mas eu preciso dele como
{Alex=2345562, Andrew=34674, Beth=2, Charles=2388491, John=223545}
Eu tentei isso (de referência ):
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());
Mas recebendo este erro
Agora estou à nora. Alguém pode ajudar por favor?
Você pode obter o resultado desejado se você usar um TreeMap
em vez do padrão HashMap
quando você cria o Map
assim:
Map<String, Long> employeeFirstNameCount = employees.stream()
.collect(Collectors.groupingBy(Employee::getFirstName,
TreeMap::new,
Collectors.counting()));
Os java.util.TreeMap
usos a ordem natural das suas chaves (que é suficiente para o que você precisa) ou pode proporcionar um costumeComparator
Nota Eu uso a expressão lambda Employee::getFirstName
em vez de p -> p.getFirstName()
, mas ambos produzem o mesmo resultado.