2016-07-22 2 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

하나의 성명에서이 작업을 수행한다고 가정합니까? 그냥 (I이 테스트를하지 않은 경우) 당신에게 아이디어를주고 : 물론

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

, 이것은 내가 쓰는 권하고 싶지 않다 매우 추한 이해할 수없는 코드입니다. Btw, 동일한 최대 카운트를 가진 두 개 이상의 스포츠간에 추첨이있는 경우이 솔루션은 결정적이지 않습니다.