Contagem ocorrências de uma cadeia em uma lista, em seguida, classificar o resultado - Java 8

AMagic:

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

digite descrição da imagem aqui

Agora estou à nora. Alguém pode ajudar por favor?

DSantiagoBC:

Você pode obter o resultado desejado se você usar um TreeMapem vez do padrão HashMapquando você cria o Mapassim:

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

Os java.util.TreeMapusos 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::getFirstNameem vez de p -> p.getFirstName(), mas ambos produzem o mesmo resultado.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=203282&siteId=1
Recomendado
Clasificación