Sortieren nach Datum absteigend Komparator funktioniert nicht wie erwartet
Versuche den Sinn der folgenden Ausgabe:
public class CommunicationComparator implements Comparator<Communication> {
@Override
public int compare(Communication comm1, Communication comm2) {
long t1 = comm1.getDate().getTime();
long t2 = comm2.getDate().getTime();
return (int) (t2 - t1);
}
}
Die Methode getDate() liefert eine java.sql.Timestamp.
Hier ist die Ausgabe vor dem Sortieren:
for (Communication n : retVal) {
System.out.println(n.getDate().toString());
}
2012-10-03 10:02:02.0
2012-10-07 03:02:01.0
2012-10-08 13:02:02.0
2012-10-09 03:02:00.0
2012-11-26 10:02:05.0
2012-11-28 11:28:11.0
2012-12-03 12:03:01.0
2012-12-06 15:03:01.0
2012-12-13 14:03:00.0
2012-12-28 11:03:00.0
2012-12-28 13:49:21.0
Und nach:
Collections.sort(retVal, new CommunicationsComparator());
2012-12-13 14:03:00.0
2012-12-06 15:03:01.0
2012-12-03 12:03:01.0
2012-11-28 11:28:11.0
2012-10-09 03:02:00.0
2012-10-08 13:02:02.0
2012-11-26 10:02:05.0
2012-10-07 03:02:01.0
2012-10-03 10:02:02.0
2012-12-28 13:49:21.0
2012-12-28 11:03:00.0
Irgendwelche Ideen, warum die beiden unteren Objekte möglicherweise nicht korrekt sortiert werden? Ich bin mit dem MySQL-JDBC-Implementierung dieses Zeitstempels.
java.sql.Timestamp
implementiert Comparable
und hat damit einen compareTo()
Methode. Warum nicht delegieren direkt wie return comm1.getDate().compareTo(comm2.getDate());
?Das ist der beste Ansatz, und ehrlich gesagt fühle ich mich dumm, nicht darüber nachzudenken. Dies ist, was ich tun werde.
Du bist herzlich willkommen. Es so Aussehen, dass Peter kopiert hat diese Antwort danach, also werde ich nicht umbuchen es.
InformationsquelleAutor maple_shaft | 2013-01-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Unterschied zwischen den letzten 2 Termine und frühere Termine überlauf integer.
Vielleicht eine bessere Lösung wäre der Vergleich der Werte, anstatt zu subtrahieren.
Was für ein Anfänger Fehler, den ich gemacht habe! Vielen Dank für diesen Hinweis an mich. 🙂
Ein kurzer Weg, dies zu tun, mit dem ternären operator:
return t1 == t2 ? 0 : t1 < t2 ? -1 : 1;
danke Mann, den Sie retten meinen Tag.
Ich würde nicht sagen, ein Anfängerfehler - aber ein sehr schöner Einblick durch op ' s beantworten Ritter.
InformationsquelleAutor James McMinn
Wenn der Unterschied größer als etwa 25 Tage, ein überlauf Auftritt. (Int kann nicht stellen eine größere Zeitdifferenz in Millisekunden als etwa 25 Tagen). Dadurch wird der Vergleich falsch.
Dieses Problem kann gelöst werden, durch ändern der return-Anweisung in:
InformationsquelleAutor gogognome
Können Sie
aber Sie sind besser dran, den Vergleich der Daten.
InformationsquelleAutor Peter Lawrey
Meine erste Idee ist, dass das problem ist ein überlauf.
t1
undt2
sindlong
s. Die anderen können passen nicht in einen int.Ich würde überprüfen, dass.
Wenn vergleichen, die auf der zweiten Ebene ist gut genug für Sie ist, sollten Sie versuchen:
Garantiert dies nicht, dass es nicht überläuft.
Ich würde zumindest einen test.
Ich denke, die beste Antwort ist nicht von mir.
Mein Favorit ist:
int
. Es scheint so.InformationsquelleAutor MrSmith42