2017-11-30 14 views
2

Java에서 입력 ArrayList의 람다 식을 사용하여 HashMap의 세 개의 레이어를 만들고 싶습니다. 세 개의 레이어는 연, 월, 주이며, 여기에 처음 두 레이어에 대한 코드가 있습니다. 그러나, 두 번째 레이어에서 나는 오류가 발생했습니다 (첫 번째 레이어는 잘 작동합니다).람다 식을 사용하여 중첩 해시 맵을 생성하십시오.

public HashMap<Integer,HashMap<Integer,HashMap<Integer,AbcDetails>>> createHashMapOfTimePeriod(List<AbcDetails> abcDetails){ 

    Map<Integer,List<AbcDetails>>result1=abcDetails.stream().collect(Collectors.groupingBy(AbcDetails::getYear)); 
    Map<Integer,Map<Integer,AbcDetails>>reult2=result1.entrySet().stream().collect(Collectors.groupingBy(e -> (e.getValue().stream().collect(Collectors.groupingBy(AbcDetails::getWeek))))); 

    return null; 

} 
당신은 중첩 된 Collector들과이를 달성 할 수

답변

3

: 같은 해, 월, 주 가진 여러 AbcDetails 경우가있을 수 있습니다 경우, 내부 Map은 여러 값을 가질 것이다

Map<Integer,Map<Integer,Map<Integer,AbcDetails>>> groups = 
    abcDetails.stream() 
     .collect(Collectors.groupingBy (AbcDetails::getYear, 
             Collectors.groupingBy (AbcDetails::getMonth, 
                   Collectors.toMap (AbcDetails::getWeek, Function.identity())))); 

주 동일한 키이므로 위의 코드는 실패합니다. 이러한 문제를 해결하는 한 가지 방법은 출력을 다음과 같이 변경하는 것입니다.

Map<Integer,Map<Integer,Map<Integer,List<AbcDetails>>>> groups = 
    abcDetails.stream() 
     .collect(Collectors.groupingBy (AbcDetails::getYear, 
             Collectors.groupingBy (AbcDetails::getMonth, 
                   Collectors.groupingBy (AbcDetails::getWeek)))); 
+0

두 번째 및 세 번째 레이어 데이터가 반복되는 유일한 연도는 고유 한 것입니까? – shridhar

+0

@shridhar 유일한 문제는 내부 대부분의지도 일 수 있습니다. 동일한 해, 달 및 주를 가진 여러 객체가있는 경우 가장 안쪽의지도에 중복 키가 생기며이를 해결할 방법을 결정해야합니다. 그런 중복 키를 설명하기 위해 구조체를'Map >>>'으로 변경할 수 있습니다. – Eran