【问题标题】:Tricky - Most favourite sport in the age group using lambdasTricky - 使用 lambdas 的年龄段中最喜欢的运动
【发布时间】:2016-07-22 20:58:55
【问题描述】:

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

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.     

     }
}

PersonManager 有一个 Person 名称和对应的 Person 对象的内部映射。 我想获得特定年龄段所有人最喜欢的商品。

假设我有 100 个人(随机数),假设我有 25 个人在 20 岁年龄段,在 20 岁年龄段的 25 个人中,我想找到选择最多的运动。

我如何根据地图值对所有人的年龄进行分组,并存储该年龄组最喜欢的运动。

【问题讨论】:

  • 从地图值中获取每个人,将他们除以您的年龄范围,然后从该年龄范围内的人中找出最流行的运动。繁荣,你有你最喜欢的运动。
  • persons.entrySet().stream().collect(Collectors.groupingBy(Person::getAge)); - 尝试分组时出现错误。不知道如何根据年龄从地图中获取值对象。
  • 这可能有帮助 docs.oracle.com/javase/8/docs/api/java/util/stream/… 或者你可以用老式的方式在 keySets 上使用 for-each 循环
  • 我实际上是在尝试学习和试验 lambda 和流。所以我不想用老式的方式来做。我已阅读文档,示例仅使用列表作为输入。所以没有多大帮助!

标签: java collections lambda java-stream


【解决方案1】:

我假设您想在一个语句中执行此操作?只是给你一个想法(我没有测试过):

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()));
}

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

【讨论】:

    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多