How do I get max country for a given arraylist

sekhar :

How do I get result set as {GERMANY=3} instead of {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);
}

The outcome as given below

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

I want like below.

 {GERMANY=3}
Naman :

You can further get the most frequent country in the map using Stream.max comparing on the values as:

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

If you're interested in just a single Map.Entry, you can use

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

Note: Both these should be extensible enough to add to the Comparator a custom logic when you want to break the tie such as frequency being equal for two countries. Just for example say, this can happen between GERMANY and UK in the sample data.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=70895&siteId=1