Trier par date décroissante de comparaison ne fonctionne pas comme prévu
En essayant de donner un sens à la sortie suivante:
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);
}
}
La méthode getDate() renvoie un java.sql.Timestamp.
Voici la sortie avant le tri:
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
Et après:
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
Des idées pourquoi les deux objets ne soient pas classés correctement? Je suis en utilisant le JDBC MySQL mise en œuvre de ce Timestamp.
- Pourquoi êtes-vous de tri sur l'horodatage de la soustraction? Plus précisément, quelle est la spec où elle est mise en œuvre?
java.sql.Timestamp
implémenteComparable
et a donc uncompareTo()
méthode. Pourquoi ne pas déléguer directement commereturn comm1.getDate().compareTo(comm2.getDate());
?- C'est la meilleure approche, et honnêtement je me sens stupide de ne pas y penser. C'est ce que je vais faire.
- Vous êtes les bienvenus. Il ressemble que Pierre a copié cette réponse par la suite, donc je ne vais pas le rediffuser.
Vous devez vous connecter pour publier un commentaire.
La différence entre les 2 dernières dates et les dates antérieures débordement d'entier.
Peut-être une meilleure solution serait de comparer les valeurs, plutôt que de soustraire eux.
return t1 == t2 ? 0 : t1 < t2 ? -1 : 1;
Si l'écart est supérieur à 25 jours, un débordement se produit. (Un int ne peut pas représenter une plus grande différence de temps en millisecondes que d'environ 25 jours). Cela permettra de faire la comparaison incorrecte.
Cela peut être résolu en modifiant l'instruction return dans:
Vous pouvez utiliser
mais vous êtes mieux comparant les dates.
Ma première idée est que le problème est un dépassement de capacité.
t1
ett2
sontlong
s. Les différentes ne pourront pas entrer dans un int.Je voudrais vérifier que.
Si on compare sur le deuxième niveau est assez bon pour vous, vous devriez essayer:
Cela ne garantit pas qu'il n'y aura pas de débordements.
J'aurais au moins ajouter un test.
Je pense que la meilleure réponse n'est pas la mienne.
Mon préféré est:
int
. Il semble donc.