2017-12-20 1 views
3

의 숫자로 최신 숫자를 찾는 방법 Map<Date, List<Integer>>이 있습니다. 여기서 정수 목록은 복권 추첨에서 던진 숫자 목록입니다. 그것은 다음과 같이 보일 수 있습니다 :지도에서 <숫자,리스트 <Integer>>

Wed Nov 15 13:31:45 EST 2017=[1, 2, 3, 4, 5, 6], 
Wed Nov 22 13:31:45 EST 2017=[7, 8, 9, 10, 11, 12], 
Wed Nov 29 13:31:45 EST 2017=[13, 14, 15, 16, 17, 18], 
Wed Dec 13 13:31:45 EST 2017=[1, 19, 20, 21, 22, 23], 
Wed Dec 20 13:31:45 EST 2017=[24, 25, 26, 27, 28, 29] 

나는 키가 복권 번호지도로 그지도를 변환해야하고, 숫자가 발생되었을 때 값이 마지막 날짜입니다. 뭔가 같은 : 1 = 수요일 12월 13일 동부 표준시 13시 31분 45초 2017 2 = 수요일 11월 15일 동부 표준시 13시 31분 45초 2017 등 그래서 49

까지, 질문은 : 그것은 그것을 만들 수 있습니다 자바 8 스트림과 함께 그렇다면, 어떻게 그럴 수 있습니다.

미리 감사드립니다.

난 당신이 이런 식으로 뭔가를 찾고있는 착각하고 있지 않다 경우

답변

3

(DateComparable입니다 가정) :

map.entrySet() 
      .stream() 
      .flatMap(x -> x.getValue().stream().map(y -> new AbstractMap.SimpleEntry<>(x.getKey(), y))) 
      .collect(Collectors.groupingBy(
        Entry::getValue, 
        Collectors.collectingAndThen(
          Collectors.maxBy(Comparator.comparing(Entry::getKey)), 
          x -> x.get().getKey()))); 
+0

작동합니다. 고맙습니다. 이제 나는 그것을 이해할 필요가있다.))) – EasyRider

+1

@EasyRider IDE에 넣고 각 단계에서'x, y'가 무엇인지 볼 수 있다면 이해하기가 훨씬 쉬울 것입니다 ... – Eugene

+0

'collect' 단계를 간단하게 할 수 있습니다 :'Collectors .toMap (Map.Entry :: getValue, Map.Entry :: getKey, BinaryOperator. maxBy (Comparator.naturalOrder())) ' – Flown

1

을 여기에 그것을 할 수있는 간결 방법 (스트림없이, 그래도)입니다 :

Map<Integer, Date> result = new HashMap<>(); 
map.forEach((date, list) -> list.forEach(n -> result.merge(n, date, 
    (oldDate, newDate) -> newDate.after(oldDate) ? newDate : oldDate))); 

이것은 map 맵을 반복하고 (date, list) 쌍 각각에 대해 list 숫자 목록을 반복합니다. 그런 다음 Map.mergeDate.after 메서드를 사용하여 result 맵에 항목을 입력하여 마지막 날짜 만 주어진 번호에 매핑되도록합니다.

+1

나는 맹세한다! * 나는 너를 여기서 볼 것임을 알았다. 나는 또한 마지막 뉴스 레터를 즐겼다. (꽤 많이) – Eugene

+0

@Eugene 그 점에 대해 고마워. 너의지지에 진심으로 감사한다. 나는 두 번째 부분을 쓰고있다 (찌그러지고있는 소개가 준비가되어있다). Btw, flatMap 버그에 대한 훌륭한 대답, 맨 처음부터 분명합니다. 그들이 100 % 게으름이되도록 고쳐 주길 바래요. –

+0

Federico 고맙습니다. 그것은 잘 작동합니다. 또한 이해하려고 노력할 것입니다. :-) 미안하지만 이미 유진의 대답을 받아 들였습니다. – EasyRider