Java 棘手-使用lambdas的年龄组中最受欢迎的运动

Java 棘手-使用lambdas的年龄组中最受欢迎的运动,java,collections,lambda,java-stream,Java,Collections,Lambda,Java Stream,我有一个Person类,有名字、年龄和最喜欢的运动(游泳、跑步、自行车、拳击、摔跤)的列表 公共类人物{ 私有字符串名称; 私人互联网; 私人喜爱的体育项目; 公众人物(字符串名称、整数、列表收藏夹){ this.name=名称; 这个。年龄=年龄; 最喜爱的运动=最喜爱的; } 公共字符串getName(){ 返回名称; } 公共整数getAge(){ 回归年龄; } 公共列表获取收藏夹(){ 回报喜爱的运动; } } 公共类人事经理{ private-Map persons=new-Hash

我有一个Person类,有名字、年龄和最喜欢的运动(游泳、跑步、自行车、拳击、摔跤)的列表

公共类人物{
私有字符串名称;
私人互联网;
私人喜爱的体育项目;
公众人物(字符串名称、整数、列表收藏夹){
this.name=名称;
这个。年龄=年龄;
最喜爱的运动=最喜爱的;
}
公共字符串getName(){
返回名称;
}
公共整数getAge(){
回归年龄;
}
公共列表获取收藏夹(){
回报喜爱的运动;
}
}
公共类人事经理{
private-Map persons=new-HashMap();
public void CalculateMostFavoriteFounder()的计算{
//1.根据年龄对所有人员进行分组
//2.统计该年龄组中每项运动最喜爱的运动
//3.在地图中存储年龄组中的年龄和喜爱的运动。
}
}
PersonManager具有人名和相应的Person对象的内部映射。 我想在特定年龄段的所有人中获得最喜爱的物品

假设我有100人(随机数),假设我有25人在20岁年龄组,在20岁年龄组的25人中,我想找到最受欢迎的运动


如何从地图值中对所有人的年龄进行分组,并存储该年龄组最喜爱的运动。

我假设您希望在一条语句中完成此操作?只是给你一个想法(我还没有测试过这个):

public void CalculateMostFavoriteFounder(整数年龄){
Map age2Sport=newhashmap();
persons.values().stream()
.collect(分组依据(Person::getAge))
.get(age.stream())
.flatMap(p->p.getFavorites().stream())
.collect(groupby(i->i,HashMap::new,counting())
.entrySet().stream()
.max(比较长度(Map.Entry::getValue))
.ifPresent(entry->age2Sport.put(age,entry.getKey());
}

当然,这是非常难看和不可理解的代码,我不建议编写。顺便说一句,如果两个或多个具有相同最大计数的运动之间存在平局,此解决方案是不确定的。

从地图值中获取每个人,将其除以您的年龄范围,然后从该年龄范围内的所有人身上横向查找最受欢迎的运动。Boom你有你最喜欢的运动。persons.entrySet().stream().collect(Collectors.groupingBy(Person::getAge));-我尝试分组时出错。不确定如何根据年龄从映射到组中获取值对象。这可能会有所帮助,或者您可以通过键集上的for-each循环使用老式方法来实现。我实际上正在尝试学习和实验lambda和streams。所以我不想用老式的方式。我已经阅读了文档,示例仅使用列表作为输入。没什么帮助!
public class Person {

    private String name;
    private int age;
    private List<String> favouriteSports;


    public Person(String name, int age, List<String> favourites) {
        this.name = name;
        this.age = age;
        this.favouriteSports= favourites;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public List<String> getFavourites() {
        return favouriteSports;
    }
}

public class PersonManager {

private Map<String, Person> persons = new HashMap<>();

     public void calculateMostFavouriteForAge(){

     //1. Group all persons according to age
     //2. Get count of favourite sports for every sport in that age group
     //3. Store the age and the favourite sport in the age group in a Map.     

     }
}
public void calculateMostFavouriteForAge(int age) {

    Map<Integer, String> age2Sport = new HashMap<>();

    persons.values().stream()
            .collect(groupingBy(Person::getAge))
            .get(age).stream()
            .flatMap(p -> p.getFavourites().stream())
            .collect(groupingBy(i -> i, HashMap::new, counting()))
            .entrySet().stream()
            .max(comparingLong(Map.Entry::getValue))
            .ifPresent(entry -> age2Sport.put(age, entry.getKey()));
}