Как получить максимальную страну для данного массива - PullRequest
0 голосов
/ 25 ноября 2018

Как мне получить результат, установленный как {GERMANY = 3} вместо {GERMANY = 3, POLAND = 2, UK = 3}

public class Student {
    private final String name;
    private final int age;
    private final Country country;
    private final int score;

    // getters and setters (omitted for brevity)
}

public enum Country { POLAND, UK, GERMANY }


//Consider below code snippet 

public static void main(String[] args) {
    List<Student> students = Arrays.asList(
            /*          NAME       AGE COUNTRY          SCORE */
            new Student("Jan",     13, Country.POLAND,  92),
            new Student("Anna",    15, Country.POLAND,  95),
            new Student("Helga",   14, Country.GERMANY, 93),
            new Student("Leon",    14, Country.GERMANY, 97),
            new Student("Chris",    15, Country.GERMANY, 97),
            new Student("Michael", 14, Country.UK,      90),
            new Student("Tim",     15, Country.UK,      91),
            new Student("George",  14, Country.UK,      98)
    );

// Java 8 code to get all countries code but 
// How do I get the only country that has maximum students from ArrayList given above.

    Map<Country, Long> numberOfStudentsByCountry =
            students.stream()
                    .collect(groupingBy(Student::getCountry, counting()));
    System.out.println(numberOfStudentsByCountry);
}

Результат, как указано ниже

 {GERMANY=3, POLAND=2, UK=3}

Я хочу, как показано ниже.

 {GERMANY=3}

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018
Map.Entry<Country, Long> maxEntry = students.stream()
          .collect(groupingBy(Student::getCountry, counting()))
          .entrySet().stream().max(Map.Entry.comparingByValue()).get();
0 голосов
/ 25 ноября 2018

Далее вы можете получить наиболее часто встречающуюся страну на карте, используя Stream.max, сравнивая значения следующим образом:

Country mostFrequent = numberOfStudentsByCountry.entrySet()
        .stream()
        .max(Map.Entry.comparingByValue())
        .map(Map.Entry::getKey)
        .orElse(Country.POLAND) // some default country

Если вас интересует только одна Map.Entry, вы можете использовать

Map.Entry<Country,Long> mostFrequentEntry = numberOfStudentsByCountry.entrySet()
        .stream()
        .max(Map.Entry.comparingByValue()) // extensible here
        .orElse(null); // you can default according to service

Примечание : оба они должны быть достаточно расширяемыми, чтобы добавить к Comparator пользовательскую логику, когда вы хотите разорвать связь, например, при равной частотедля двух стран.Например, это может произойти между ГЕРМАНИЯ и UK в данных выборки.

...