2017-12-20 10 views
3

Sagen wir, ich habe eine Map<Date, List<Integer>>, wo Liste der ganzen Zahlen ist nur eine Liste der Zahlen in Lotterie gezogen. Es kann wie folgt aussehen:So finden Sie das neueste Datum für jede Zahl in der Zeichnung, von Karte <Datum, Liste <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] 

Ich brauche diese Karte in die Karte zu konvertieren, in dem Schlüssel die Lotterie Zahl ist, und der Wert ist der letzte Zeitpunkt, wenn die Zahl geworfen wurde. Etwas wie: 1 = Mi 13. Dezember 13.31.45 EST 2017 2 = Mi 15. November 13.31.45 EST 2017 usw. bis 49.

Also, die Frage ist: Ist es möglich zu machen, mit den Java 8 Streams und wenn ja, dann wie.

Vielen Dank im Voraus.

Antwort

3

Wenn ich nicht verwechselt Sie für so etwas suchen (unter der Annahme Date ist Comparable):

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

Es funktioniert. Vielen Dank. Jetzt muss ich es verstehen.)))) – EasyRider

+1

@EasyRider es könnte viel einfacher zu verstehen, wenn Sie es in eine IDE setzen und sehen, was 'x, y' sind in jedem Schritt ... – Eugene

+0

Sie können den' collect' Schritt zu vereinfachen, indem Sie: 'Collectors .toMap (Map.Entry :: getValue, Map.Entry :: getKey, BinaryOperator. maxBy (Comparator.naturalOrder())) ' – Flown

1

Hier ist ein succint Weg, es zu tun (ohne Ströme, obwohl):

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

Dies iteriert die map Karte und für jedes seiner (date, list) Paare iteriert es die list Liste der Zahlen. Dann verwendet es die Methoden Map.merge und Date.after, um Einträge in die result Karte so zu setzen, dass nur das letzte Datum einer bestimmten Nummer zugeordnet wird.

+1

Ich * schwöre! * Ich wusste, dass ich dich hier sehen werde. Ich habe auch deinen letzten Newsletter (ziemlich viel) genossen – Eugene

+0

@Eugene Danke dafür, Mann ... Ich schätze deine Unterstützung sehr. Ich schreibe den 2. Teil (das Abschweifungs-Intro ist fertig). Btw, tolle Antwort auf den FlatMap Bug, klar von Anfang an. Ich wünschte, sie haben es repariert, so dass es 100% faul ist ... –

+0

Danke Federico. Es funktioniert auch. Auch werden versuchen zu verstehen. :-) Tut mir leid, aber ich habe Eugenes Antwort bereits als akzeptiert markiert. – EasyRider

Verwandte Themen