如何获得给定数组列表的最大国家



如何将结果集设置为{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}

您可以使用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添加自定义逻辑。例如,在样本数据中,这可能发生在德国英国之间。

Map.Entry<Country, Long> maxEntry = students.stream()
.collect(groupingBy(Student::getCountry, counting()))
.entrySet().stream().max(Map.Entry.comparingByValue()).get();

最新更新