2016-12-01 3 views
0

Ich arbeite mit einem List von Person Objekte. Ich versuche, alle Person mit dem maximalen Datum schnell zu identifizieren und zurückzugeben.Java und Max Wert Problem

Zum Beispiel:

Persons:[ 
{ 
    id: 1 
    submitDate: 2010-01-01 
    name : john Smith 
}, 
{ 
    id: 1 
    submitDate: 2011-01-01 
    name : john Smith 
}, 
{ 
    id: 2 
    submitDate: 2011-01-02 
    name : jason Doe 
}, 
{ 
    id: 1 
    submitDate: 2012-01-01 
    name : john Smith 
}, 
{ 
    id: 1 
    submitDate: 2013-01-01 
    name : john Smith 
}, 
{ 
    id: 2 
    submitDate: 2013-01-02 
    name : jason Doe 
} 
] 

ich nach einem Weg suchen, in Java, zurückzukehren, um den folgenden (Max submitDate Wert):

Persons: [ 
{ 
    id: 1 
    submitDate: 2013-01-01 
    name : john Smith 
}, 
{ 
    id: 2 
    submitDate: 2013-01-02 
    name : jason Doe 
} 
] 

Irgendwelche Gedanken darüber, wie man dies am besten erreichen?

============================================== ========================== ich habe versucht:

List<Person> personList = Lists.newArrayList(); 
getPersonList().stream() 
       .map(this.setSource) 
       .max(Comparator.comparing(Person::getSubmitDate)) 
       .map(personList::add); 

aber sie einen einzigen Person Datensatz zurückgibt, nicht die max submitDate für jedePerson

+0

Für zukünftige Suchen und Schreiben, verwenden Sie das Wort "distinct", wenn Sie beabsichtigen, doppelte Werte zu eliminieren. Angesichts Ihrer Beispieldaten sehe ich nicht, dass Sie nach "Maximum" streben. Ich sehe nur das Entfernen von Duplikaten, um eine eindeutige Liste zu erstellen. Bearbeiten Sie Ihre Frage zur Klärung. Mögliches Duplikat: [Java - Distinct Liste der Objekte] (http://stackoverflow.com/q/1019854/642706) –

+0

@BasilBourque, wenn Sie oben lesen, gebe ich an "Ich versuche, alle' Person schnell zu identifizieren und zurückzugeben 's mit dem maximalen Datum". Ich stimme zu, dass ich meine Frage ursprünglich besser geschrieben hätte erklären können, ich wollte das maximale Datum für jede Person bekommen (basierend auf ID). Ich ging jedoch zurück und erkläre mich in meinem "Edit" – Dan

+0

Ich war in der letzten Teil meines Kommentars oben über nicht "Maximum" nicht korrekt. Ich habe die Daten falsch gelesen, da ich nur auf den Monat, aber nicht auf das Jahr geschaut habe. Vielleicht sollten Sie die Monatstage der Beispielwerte etwas bearbeiten, um zu vermeiden, dass andere denselben Fehler machen. –

Antwort

0
List<Person> persons = ... 
    List<Person> resultList = new ArrayList<>(); 
    Map<Integer, List<Person>> personsBySubmitDate = 
      persons.stream().collect(Collectors.groupingBy(person -> person.getId()); 

    for (Map.Entry<Integer, List<Person>> entry : personsBySubmitDate.entrySet()) { 
     Person currentPerson = entry.getValue() 
            .stream() 
            .max(Comparator.comparing(Person::getSubmitDate)) 
            .orElse(null); 
     resultList.add(currentPerson); 
    } 

Es sollte ange O (n) sein.

+0

Ich gebe das eine Chance. Vielen Dank! – Dan

+0

gibt es nichts zu sammeln. 'max()' Methode gibt Optional zurück, das ist im Grunde ein Wrapper für Ihr Person-Objekt. Sie können darauf zugreifen, indem Sie eine get-Methode aufrufen. Aber stellen Sie sicher, dass es da ist! – Default71721

+0

leider gibt '.max' mir einen einzigen Datensatz zurück (das Max von ** allen **' Person' Objekten), nicht das maximale Datum für jede 'Person' – Dan

0

@ Default71721, Ihre Antwort funktioniert perfekt, jedoch habe ich gemerkt, dass längere Listen das System wirklich verpuffen (Die O (n^2) Verarbeitung). Ich entschied mich, die SQL-Abfrage neu zu schreiben, die uns die Geschwindigkeit gab, die wir brauchten.

Vielen Dank für Ihre Hilfe!