Comment trier la liste des objets en fonction de la propriété

J'ai une classe simple


public class ActiveAlarm {
public long timeStarted;
public long timeEnded;
private String name = "";
private String description = "";
private String event;
private boolean live = false;
}


et
List<activealarm>

con. Comment trier par ordre croissant
timeStarted

, alors
timeEnded

? Quelqu'un peut-il aider? Je sais que B. C++ avec un algorithme commun et un opérateur de surcharge &lt;,, Mais je suis nouveau à Java.
</activealarm>
Invité:

Catherine

Confirmation de:

Soit faire
ActiveAlarm

Mise en œuvre
Comparable<activealarm>

, soit implémenter
Comparator<activealarm>

dans une classe distincte. Alors appeler:


Collections.sort/list/;


ou


Collections.sort/list, comparator/;


En général, c'est une bonne idée de mettre en œuvre
http://download.oracle.com/jav ... .html
, S'il y a un ordre de tri "natural"... autrement /Si tu

vouloir trier dans un certain ordre, mais avec la même facilité, vous pouvez choisir un autre/ Mieux mettre en œuvre
http://download.oracle.com/jav ... .html
. Cette situation particulière peut aller dans n'importe quelle direction, être honnête ... mais je voudrais

Probablement

, adhéré à une version plus flexible
Comparator<t>

.

EDIT: Exemple de mise en œuvre:


public class AlarmByTimesComparer implements Comparator<activealarm> {
@Override
public int compare/ActiveAlarm x, ActiveAlarm y/ {
// TODO: Handle null x or y values
int startComparison = compare/x.timeStarted, y.timeStarted/;
return startComparison != 0 ? startComparison
: compare/x.timeEnded, y.timeEnded/;
}

// I don't know why this isn't in Long...
private static int compare/long a, long b/ {
return a &lt; b ? -1
: a &gt; b ? 1
: 0;
}
}


</activealarm></t></activealarm></activealarm>

Alice

Confirmation de:

Utilisant
http://download.oracle.com/jav ... .html
par exemple

:


class Score {

private String name;
private List<integer> scores;
// +accessor methods
}



Collections.sort/scores, new Comparator<score>// {

public int compare/Score o1, Score o2/ {
// compare two instance of `Score` and return `int` as result.
return o2.getScores//.get/0/.compareTo/o1.getScores//.get/0//;
}
}/;


Commençant par Java 8, Vous pouvez simplement utiliser l'expression lambda Représenter une instance de comparaison.


Collections.sort/scores, /s1, s2/ -&gt; { /* compute and return int */ }/;


</score></integer>

Christine

Confirmation de:

JAVA 8 Et au-dessus de la réponse /Utiliser des expressions

Lambda/

DANS Java 8 Les expressions ont été introduites Lambda, Pour le rendre encore plus facile! Au lieu de créer un objet Comparator// Avec toutes ses forêts de construction, vous pouvez le simplifier comme suit: /Utiliser votre objet comme exemple/


Collections.sort/list, /ActiveAlarm a1, ActiveAlarm a2/ -> a1.timeStarted-a2.timeStarted/;


ou même plus court:


Collections.sort/list, Comparator.comparingInt/ActiveAlarm ::getterMethod//;


Ceci est une déclaration équivaut à ce qui suit:


Collections.sort/list, new Comparator<activealarm>// {
@Override
public int compare/ActiveAlarm a1, ActiveAlarm a2/ {
return a1.timeStarted - a2.timeStarted;
}
}/;


Penser aux expressions Lambda En ce qui concerne ce que vous devez seulement être placé dans les parties appropriées du code: la signature de la méthode et ce qui est retourné.

Une autre partie de votre question était de savoir comment comparer plusieurs champs. Faire avec des expressions Lambda, Vous pouvez utiliser la fonction
.thenComparing//

Pour une combinaison efficace de deux comparaisons en une:


Collections.sort/list, /ActiveAlarm a1, ActiveAlarm a2/ -&gt; a1.timeStarted-a2.timeStarted 
.thenComparing //ActiveAlarm a1, ActiveAlarm a2/ -&gt; a1.timeEnded-a2.timeEnded/
/;


Le code ci-dessus trie la liste d'abord par
timeStarted

, puis dans
timeEnded

/Pour ces enregistrements qui ont le même
timeStarted

/.

Dernière note: facile à comparer 'long' ou 'int' Primitives, vous pouvez simplement soustraire l'un des autres. Si vous comparez des objets /'Long' ou 'String'/, Je vous suggère d'utiliser leur comparaison intégrée. Exemple:


Collections.sort/list, /ActiveAlarm a1, ActiveAlarm a2/ -&gt; a1.name.compareTo/a2.name/ /;


EDIT: Merci Lucas Edrie pour me dire la fonction
.thenComparing//

.
</activealarm>

Emilie

Confirmation de:

Nous pouvons trier la liste de deux manières.

:

1. En utilisant un comparateur

: Si nécessaire, utilisez la logique de tri dans plusieurs endroits
Si vous souhaitez utiliser la logique de tri dans un endroit, vous pouvez écrire la classe interne anonyme comme suit ou supprimez le comparateur et utilisez-le à plusieurs endroits.


Collections.sort/arrayList, new Comparator<activealarm>// {
public int compare/ActiveAlarm o1, ActiveAlarm o2/ {
//Sorts by 'TimeStarted' property
return o1.getTimeStarted//<o2.gettimestarted ?-1:o1.gettimestarted=""></o2.gettimestarted>o2.getTimeStarted//?1:doSecodaryOrderSort/o1,o2/;
}

//If 'TimeStarted' property is equal sorts by 'TimeEnded' property
public int doSecodaryOrderSort/ActiveAlarm o1,ActiveAlarm o2/ {
return o1.getTimeEnded//<o2.gettimeended ?-1:o1.gettimeended=""></o2.gettimeended>o2.getTimeEnded//?1:0;
}
}/;


Nous pouvons demander null Vérifiez les propriétés si nous pourrions utiliser 'Long' au lieu 'long'.

2. L'utilisation de comparable /Ordre naturel/

: Si l'algorithme de tri adhère toujours à une propriété:
Écrire une classe mettant en œuvre la méthode 'Comparable' et redéfinir la méthode 'compareTo', Tel que défini ci-dessous


class ActiveAlarm implements Comparable<activealarm>{

public long timeStarted;
public long timeEnded;
private String name = "";
private String description = "";
private String event;
private boolean live = false;

public ActiveAlarm/long timeStarted,long timeEnded/ {
this.timeStarted=timeStarted;
this.timeEnded=timeEnded;
}

public long getTimeStarted// {
return timeStarted;
}

public long getTimeEnded// {
return timeEnded;
}

public int compareTo/ActiveAlarm o/ {
return timeStarted<o.gettimestarted ?-1:timestarted="">o.getTimeStarted//?1:doSecodaryOrderSort/o/;
}

public int doSecodaryOrderSort/ActiveAlarm o/ {
return timeEnded<o.gettimeended ?-1:timeended="">o.getTimeEnded//?1:0;
}


}

Appeler la méthode de tri pour le tri basé sur une organisation naturelle


Collections.sort/list/;


</o.gettimeended></o.gettimestarted></activealarm></activealarm>

Giselle

Confirmation de:

DANS java8+ Cela peut être écrit en une ligne comme suit,

collectionObjec.sort/comparator_lamda/ ou comparateur. Cadre/CollectionType::getterOfProperty/

le code :


ListOfActiveAlarmObj.sort//a,b->a.getTimeStarted//.compareTo/b.getTimeStarted/////


ou


ListOfActiveAlarmObj.sort/Comparator.comparing/ActiveAlarm::getTimeStarted//

Alice

Confirmation de:

public class ActiveAlarm implements Comparable<activealarm> {
public long timeStarted;
public long timeEnded;
private String name = "";
private String description = "";
private String event;
private boolean live = false;

public int compareTo/ActiveAlarm a/ {
if / this.timeStarted &gt; a.timeStarted /
return 1;
else if / this.timeStarted &lt; a.timeStarted /
return -1;
else {
if / this.timeEnded &gt; a.timeEnded /
return 1;
else
return -1;
}
}


Cela devrait vous donner une vue approximative. Dès que cela se fait, vous pouvez appeler
Collections.sort//

par la liste.
</activealarm>

Emilie

Confirmation de:

Commençant par Java8 Cela peut être fait encore, en utilisant une combinaison
http://download.oracle.com/jav ... .html
et
https://docs.oracle.com/javase ... .html
par exemple

:


class Student{

private String name;
private List<score> scores;

// +accessor methods
}

class Score {

private int grade;
// +accessor methods
}



Collections.sort/student.getScores//, Comparator.comparing/Score::getGrade/;


</score>

Catherine

Confirmation de:

https://google.github.io/guava ... .html
Goyave :


Collections.sort/list, new Comparator<activealarm>//{
@Override
public int compare/ActiveAlarm a1, ActiveAlarm a2/ {
return ComparisonChain.start//
.compare/a1.timestarted, a2.timestarted/
//...
.compare/a1.timeEnded, a1.timeEnded/.result//;
}}/;


</activealarm>

Christine

Confirmation de:

vous pouvez utiliser
http://download.oracle.com/jav ... .List,%20java.util.Comparator%29
et transférer votre propre
http://download.oracle.com/jav ... .html

Emilie

Confirmation de:

DANS java Vous devez utiliser une méthode statique
Collections.sort

. Voici un exemple pour la liste des objets CompanyRole, Tri premier pour commencer, puis à la fin. Vous pouvez facilement vous adapter à votre propre objet.


private static void order/List<textcomponent> roles/ {

Collections.sort/roles, new Comparator// {
@Override
public int compare/Object o1, Object o2/ {
int x1 = //CompanyRole/ o1/.getBegin//;
int x2 = //CompanyRole/ o2/.getBegin//;

if /x1 != x2/ {
return x1 - x2;
} else {
int y1 = //CompanyRole/ o1/.getEnd//;
int y2 = //CompanyRole/ o2/.getEnd//;
return y2 - y1;
}
}
}/;
}


</textcomponent>

Hannah

Confirmation de:

Tu peux appeler Collections.sort// Et transfert au comparateur que vous devez écrire pour comparer les différentes propriétés de l'objet.

Babette

Confirmation de:

Comme mentionné, vous pouvez trier par:

Faire son objet de réalisation
Comparable


Ou passer
Comparator

à
Collections.sort


Si vous faites les deux, alors
Comparable

sera ignoré, et
Comparator

sera utilisé. Cela aide les objets value avoir leur propre logique
Comparable

, Quel est le tri le plus raisonnable pour votre objet value, Tandis que chaque utilisation individuelle a sa propre mise en œuvre.

Pour répondre aux questions, connectez-vous ou registre