2016-07-22 4 views
-1

を使用して年齢層のほとんどの好きなスポーツ、好きなスポーツの年齢やリスト(水泳、ランニング、サイクリング、ボクシング、レスリング)トリッキー - 私は名前を持つ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人(乱数)があり、20歳の年齢層に属する25人の人がいるとします.20歳の25人のうち、最も選んだスポーツを探しています。

どの年齢の地図値からすべての人にグループ分けし、その年齢層に最も好きなスポーツを保存するにはどうすればいいですか?

+0

地図の値からすべての人を取得し、年齢の範囲で除算し、その年齢層の人々を横断して、すべてのスポーツが最も人気のあるスポーツを見つけます。あなたはあなたの最も好きなスポーツを持っています。 – Dominic

+0

persons.entrySet()。stream()。collect(Collectors.groupingBy(Person :: getAge)); - グループ化しようとするとエラーが発生します。年齢に基づいて値オブジェクトをマップからグループ化する方法が不明です。 – megan

+0

これは、https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html に役立つかもしれません。または、for-eachループを使用して旧式の方法で行うことができます。 keySets – Dominic

答えて

2

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

、これは私が書くことをお勧めしません非常に醜いと不可解なコードです。同じ最大カウントを有する2つ以上のスポーツの間にドローがある場合、この解決策は決定論的ではない。

関連する問題