Chaque exemple que je trouve consiste à faire cela par ordre alphabétique, alors que j'ai besoin de mes éléments triés par date.
My ArrayList contient des objets sur lesquels l'un des datamembers est un objet DateTime. Sur DateTime, je peux appeler les fonctions:
lt() // less-than
lteq() // less-than-or-equal-to
Donc, pour comparer, je pourrais faire quelque chose comme:
if(myList.get(i).lt(myList.get(j))){
// ...
}
Que dois-je faire à l'intérieur du bloc if?
Réponses:
Vous pouvez rendre votre objet comparable:
Et puis vous le triez en appelant:
Cependant, parfois, vous ne souhaitez pas modifier votre modèle, comme lorsque vous souhaitez trier sur plusieurs propriétés différentes. Dans ce cas, vous pouvez créer un comparateur à la volée:
Cependant, ce qui précède ne fonctionne que si vous êtes certain que dateTime n'est pas nul au moment de la comparaison. Il est sage de gérer également null pour éviter les NullPointerExceptions:
Ou dans le deuxième exemple:
la source
Depuis Java 8, l' interface List fournit la méthode de tri . Combinée à l' expression lambda , la solution la plus simple serait
Tri inversé
Java 8 est également fourni avec des méthodes pratiques pour le tri inversé.
la source
list.sort(Comparator.comparing(o -> o.getDateTime()));
list.sort(Comparator.comparing(MyObject::getDateTime)
Vous pouvez utiliser la méthode Collections.sort. C'est une méthode statique. Vous lui passez la liste et un comparateur. Il utilise un algorithme de tri de fusion modifié sur la liste. C'est pourquoi vous devez lui passer un comparateur pour faire les comparaisons de paires.
Notez que si myList est d'un type comparable (celui qui implémente l'interface Comparable) (comme Date, Integer ou String), vous pouvez omettre le comparateur et l'ordre naturel sera utilisé.
la source
La meilleure réponse à mon humble avis de Tunaki en utilisant Java 8 lambda
la source
Étant donné
MyObject
qu'il a unDateTime
membre avec unegetDateTime()
méthode, vous pouvez trier unArrayList
qui contient desMyObject
éléments par lesDateTime
objets comme ceci:la source
Voici comment j'ai résolu:
J'espère que cela vous aidera.
la source
Avec l'introduction de Java 1.8, les flux sont très utiles pour résoudre ce genre de problèmes:
la source
Toutes les réponses que j'ai trouvées ici sont inutilement complexes pour un problème simple (du moins pour un développeur Java expérimenté, ce que je ne suis pas). J'ai eu un problème similaire et je suis tombé sur cette solution (et d'autres), et bien qu'elles aient fourni un pointeur, pour un débutant, j'ai trouvé comme indiqué ci-dessus. Ma solution dépend de l'emplacement de l'objet de votre date, dans ce cas, la date est le premier élément de l'objet [] où dataVector est le ArrayList contenant vos objets.
la source
DateTime
objet contenu dans un autre objet. Si c'était seulementDate
ou desDateTime
objets,Comparable
il n'y avait pas besoin d'unComparator
.Cela peut être une ancienne réponse mais j'ai utilisé quelques exemples de ce poste pour créer un comparateur qui trierait un
ArrayList
deHashMap<String, String>
par un objet dans la liste, qui étant l'horodatage.J'ai ces objets:
Les objets cartographiques sont les suivants:
Ce mappage est ce que j'utilise pour charger tous mes objets dans la liste de tableaux, en utilisant la
alList.add(map)
fonction, dans une boucle.Maintenant, j'ai créé mon propre comparateur:
Je peux maintenant simplement appeler le comparateur à tout moment sur le tableau et il triera mon tableau, me donnant le dernier horodatage en position 0 (en haut de la liste) et le premier horodatage à la fin de la liste. Les nouveaux messages sont mis au sommet essentiellement.
Cela peut aider quelqu'un, c'est pourquoi je l'ai publié. Prenez en considération les instructions de retour dans la fonction compare (). Il existe 3 types de résultats. Renvoie 0 s'ils sont égaux, renvoie> 0 si la première date est antérieure à la deuxième date et renvoie <0 si la première date est postérieure à la deuxième. Si vous voulez que votre liste soit inversée, changez simplement ces deux instructions de retour! Simple =]
la source
Passez l'argument ArrayList In.
la source
Utilisez l'approche ci-dessous pour identifier les dates triées ou non
la source
SimpleDateFormat
classe depuis longtemps obsolète et notoirement gênante . Du moins pas comme première option. Et pas sans aucune réserve. Aujourd'hui, nous avons tellement mieux dansjava.time
l'API de date et d'heure Java moderne et sesDateTimeFormatter
.La classe Date implémente déjà l'interface Comparator. En supposant que vous ayez la classe ci-dessous:
Et disons que vous avez une liste d'objets A
List<A> aList
, vous pouvez facilement la trier avec l'API de flux de Java 8 (extrait ci-dessous):la source
Futurs téléspectateurs, je pense que c'est la solution la plus simple, si votre modèle contient une chaîne de type date ("2020-01-01 10:00:00" par exemple), alors écrivez simplement la ligne suivante pour trier les données par date décroissant de du plus récent au plus ancien:
la source