167 votes

Trier les objets dans ArrayList par date?

Quelqu'un peut il m'aider avec ça? Chaque exemple que je trouve concerne la procédure alphabétique, alors que j'ai besoin que mes éléments soient triés par date.

Mon ArrayList contient des objets sur lesquels l'un des membres de la donnée 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))){
    // ...
}
 

Je ne sais pas vraiment quoi faire à l'intérieur du bloc if. Des idées?

451voto

Domchi Points 3550

Vous pouvez faire de votre objet comparable:

public static class MyObject implements Comparable<MyObject> {

  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 les trier en appelant:

Collections.sort(myList);

Cependant, parfois, vous ne voulez pas changer de modèle, comme lorsque vous voulez trier sur plusieurs propriétés. Dans ce cas, vous pouvez créer de comparaison à la volée:

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

Cependant, le ci-dessus ne fonctionne que si vous êtes certain que dateTime n'est pas nulle au moment de la comparaison. Il est sage de gérer la valeur null pour éviter NullPointerExceptions:

public static class MyObject implements Comparable<MyObject> {

  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 second exemple:

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

19voto

helios Points 8379

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 mergesort modifié sur la liste. C'est pourquoi vous devez passer un comparateur pour faire les comparaisons de paires.

 Collections.sort(myList, new Comparator<MyObject> {
   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 une interface comparable) (comme Date, Integer ou String), vous pouvez omettre le comparateur et l'ordre naturel sera utilisé.

8voto

WhiteFang34 Points 28652

Étant donné que MyObject a un membre DateTime avec une méthode getDateTime() , vous pouvez trier un ArrayList qui contient MyObject éléments par les objets DateTime comme ceci:

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

2voto

Nepaluz Points 93

Ici toutes les réponses que j'ai trouvé de l'onu-nécessairement complexe pour un simple problème (au moins pour un développeur java expérimenté, dont je ne suis pas). J'ai eu un problème similaire et arriva sur cela (et d'autres), des solutions de, et si ils ont fourni un pointeur, pour un débutant, j'ai trouvé comme indiqué ci-dessus. Ma solution, dépend de l'endroit où, dans l'Objet de votre Date est, dans ce cas, la date est le premier élément de l'Objet[] où dataVector est la liste de tableaux contenant vos Objets.

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

0voto

bpgergo Points 9407

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X