Trier les objects dans ArrayList par date?

Quelqu’un peut il m’aider avec ça? Chaque exemple que je trouve concerne la manière de procéder par ordre alphabétique, alors que mes éléments doivent être sortingés par date.

My ArrayList contient des objects sur lesquels l’un des datamembers est un object 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))){ // ... } 

Je ne sais pas vraiment quoi faire dans le bloc if. Des idées?

Vous pouvez rendre votre object comparable:

 public static class MyObject implements Comparable { private Date dateTime; public Date getDateTime() { return dateTime; } public void setDateTime(Date datetime) { this.dateTime = datetime; } @Override public int compareTo(MyObject o) { return getDateTime().compareTo(o.getDateTime()); } } 

Et puis vous sortingez en appelant:

 Collections.sort(myList); 

Cependant, il arrive que vous ne souhaitiez pas modifier votre modèle, par exemple lorsque vous souhaitez sortinger plusieurs propriétés différentes. Dans ce cas, vous pouvez créer un comparateur à la volée:

 Collections.sort(myList, new Comparator() { public int compare(MyObject o1, MyObject o2) { return o1.getDateTime().compareTo(o2.getDateTime()); } }); 

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 null pour éviter les exceptions NullPointerExceptions:

 public static class MyObject implements Comparable { private Date dateTime; public Date getDateTime() { return dateTime; } public void setDateTime(Date datetime) { this.dateTime = datetime; } @Override public int compareTo(MyObject o) { if (getDateTime() == null || o.getDateTime() == null) return 0; return getDateTime().compareTo(o.getDateTime()); } } 

Ou dans le deuxième exemple:

 Collections.sort(myList, new Comparator() { public int compare(MyObject o1, MyObject o2) { if (o1.getDateTime() == null || o2.getDateTime() == null) return 0; return o1.getDateTime().compareTo(o2.getDateTime()); } }); 

Depuis Java 8, l’interface List fournit la méthode de sorting . Combiné à l’expression lambda , la solution la plus simple serait

 // sort DateTime typed list list.sort((d1,d2) -> d1.compareTo(d2)); // or an object which has an DateTime atsortingbute list.sort((o1,o2) -> o1.getDateTime().compareTo(o2.getDateTime())); // or like mentioned by Tunaki list.sort(Comparator.comparing(o -> o.getDateTime())) 

Vous pouvez utiliser la méthode Collections.sort. C’est une méthode statique. Vous passez la liste et un comparateur. Il utilise un algorithme de fusion modifié sur la liste. C’est pourquoi vous devez passer un comparateur pour faire les comparaisons de paires.

 Collections.sort(myList, new Comparator { public int compare(MyObject o1, MyObject o2) { DateTime a = o1.getDateTime(); DateTime b = o2.getDateTime(); if (a.lt(b)) return -1; else if (a.lteq(b)) // it's equals return 0; else return 1; } }); 

Notez que si myList est d’un type comparable (celui qui implémente l’interface comparable) (comme Date, Integer ou Ssortingng), vous pouvez omettre le comparateur et le classement naturel sera utilisé.

Étant MyObject que MyObject a un membre DateTime avec une méthode getDateTime() , vous pouvez sortinger une ArrayList contenant des éléments MyObject par les objects DateTime comme ceci:

 Collections.sort(myList, new Comparator() { public int compare(MyObject o1, MyObject o2) { return o1.getDateTime().lt(o2.getDateTime()) ? -1 : 1; } }); 

Voici comment j’ai résolu:

 Collections.sort(MyList, (o1, o2) -> o1.getLastModified().compareTo(o2.getLastModified())); 

J’espère que cela vous aidera.

 list.sort(Comparator.comparing(o -> o.getDateTime())); 

La meilleure réponse IMHO de Tunaki en utilisant Java 8 lambda

Toutes les réponses que j’ai trouvées ici étaient nécessairement complexes pour un problème simple (au moins pour un développeur Java expérimenté, ce que je ne suis pas). J’ai eu un problème similaire et par hasard sur cette (et d’autres) solutions, et bien qu’ils aient fourni un pointeur, pour un débutant que j’ai trouvé comme indiqué ci-dessus. Ma solution dépend de l’endroit où se trouve l’object, dans ce cas, la date est le premier élément de l’object [] où dataVector est la liste de tableaux contenant vos objects.

 Collections.sort(dataVector, new Comparator() { public int compare(Object[] o1, Object[] o2) { return ((Date)o1[0]).compareTo(((Date)o2[0])); } }); 

Avec l’introduction de Java 1.8, les stream sont très utiles pour résoudre ce type de problèmes:

 Comparator  myComparator = (arg1, arg2) -> { if(arg1.lt(arg2)) return -1; else if (arg1.lteq(arg2)) return 0; else return 1; }; ArrayList sortedList = myList .stream() .sorted(myComparator) .collect(Collectors.toCollection(ArrayList::new)); 

DateTime.compare ?

Cela peut être une ancienne réponse mais j’ai utilisé quelques exemples de cet article pour créer un comparateur qui HashMap une liste de ArrayList de HashMap par un object de la liste, c’est-à-dire l’horodatage.

J’ai ces objects:

 ArrayList> alList = new ArrayList>(); 

Les objects de la carte sont les suivants:

 Map map = new HashMap<>(); // of course this is the actual formatted date below in the timestamp map.put("timestamp", "MM/dd/yyyy HH:mm:ss"); map.put("item1", "my text goes here"); map.put("item2", "my text goes here"); 

Ce mappage est ce que j’utilise pour charger tous mes objects dans la liste de tableaux, en utilisant la fonction alList.add(map) , dans une boucle.

Maintenant, j’ai créé mon propre comparateur:

 import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Map; public class DateSorter implements Comparator { public int compare(Object firstObjToCompare, Object secondObjToCompare) { Ssortingng firstDateSsortingng = ((HashMap) firstObjToCompare).get("timestamp"); Ssortingng secondDateSsortingng = ((HashMap) secondObjToCompare).get("timestamp"); if (secondDateSsortingng == null || firstDateSsortingng == null) { return 0; } // Convert to Dates DateTimeFormatter dtf = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss"); DateTime firstDate = dtf.parseDateTime(firstDateSsortingng); DateTime secondDate = dtf.parseDateTime(secondDateSsortingng); if (firstDate.isAfter(secondDate)) return -1; else if (firstDate.isBefore(secondDate)) return 1; else return 0; } } 

Je peux maintenant appeler le comparateur à tout moment sur le tableau et cela va sortinger mon tableau, en 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 premier plan.

 Collections.sort(alList, new DateSorter()); 

Cela peut aider quelqu’un, c’est pourquoi je l’ai posté. Prenez en compte les instructions de retour dans la fonction compare (). Il y a 3 types de résultats. Retourne 0 si elles sont égales, retourne> 0 si la première date est avant la deuxième date et retourne <0 si la première date est après la deuxième date. Si vous voulez que votre liste soit inversée, changez simplement ces deux déclarations de retour! Simple =]

Passez l’argument ArrayList In.

  private static void order(ArrayList list) { Collections.sort(list, new Comparator() { public int compare(Object o2, Object o1) { Ssortingng x1 = o1.Date; Ssortingng x2 = o2.Date; return x1.compareTo(x2); } }); }