2016-11-06 2 views
1

J'ai une ArrayList d'objets Foo(int id, Date date).java trier la liste par date actuelle puis par comparaison de date

Comment puis-je aller sur le tri de cette ArrayList pour ressembler à quelque chose comme ci-dessous

id = 3, date = 07 Nov 2016 
    id = 2, date = 08 Nov 2016 
    id = 5, date = 30 Nov 2016 
    id = 1, date = 05 Nov 2016 
    id = 4, date = 04 Nov 2016 

Les trois objets sont à l'avenir classés par le plus proche (à présent) d'abord, deux bas sont dans le passé trié par le plus proche (au présent) en premier.

+0

Ce n'est pas un doublon. C'est plus compliqué que de simplement trier par une propriété. – janos

+0

Et une copie de [* Comment trier une AreayList en utilisant plusieurs critères de tri *] (http://stackoverflow.com/q/3704804). ** Rechercher dépassement de pile ** avant de poster. –

Répondre

1

Pour trier par plusieurs critères, vous avez besoin d'un comparateur composite:

Collections.sort(dates, (d1, d2) -> { 
    if (d1.after(now) && d2.after(now)) { 
     return d1.compareTo(d2); 
    } 
    if (d1.before(now) && d2.before(now)) { 
     return -d1.compareTo(d2); 
    } 
    return -d1.compareTo(d2); 
}); 

C'est:

  • Si les deux dates sont après maintenant, les trier dans l'ordre normal (augmentation)
  • Si les deux dates sont avant maintenant, les trier dans l'ordre inverse (décroissant)
  • Sinon (= une date est avant maintenant, l'autre est après), les trier dans l'ordre inverse (= date plus récente vient f Premièrement, l'ancien vient plus tard)
+0

Merci à son tri correctement. –

1

Trier la liste par date, trouver le dernier élément avec date moins de today, déplacer des éléments du premier à l'élément trouvé à la fin de la liste.

+0

Merci pour la réponse, je n'ai pas bien compris ce que vous vouliez dire. –