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
, puis par timeEnded
? Quelqu'un peut-il aider? Je connais en C ++ avec un algorithme générique et un opérateur de surcharge <, mais je suis nouveau sur Java.
java
sorting
sort-object
Jennifer
la source
la source
Réponses:
Faites
ActiveAlarm
implémenterComparable<ActiveAlarm>
ou implémentezComparator<ActiveAlarm>
dans une classe distincte. Puis appelez:ou
En général, il est une bonne idée de mettre en œuvre
Comparable<T>
s'il y a un ordre de tri « naturel » ... sinon (si vous arrive de vouloir trier dans un ordre particulier, mais pourrait vouloir aussi facilement un différent) il est préférable de mettre en œuvreComparator<T>
. Cette situation particulière pourrait aller dans les deux sens, pour être honnête ... mais je resterais probablement avec l'Comparator<T>
option la plus flexible .EDIT: Exemple d'implémentation:
la source
a = Long.MIN_VALUE, b = 1
..compare
En utilisant
Comparator
Par exemple:
À partir de Java 8, vous pouvez simplement utiliser une expression lambda pour représenter l'instance de Comparator.
la source
compareTo()
-on? D'où est ce que ça vient? Où dois-je le définir?getScores()
est le getter pourscores
lequel est unList<Integer>
. Lorsque vousgetScores().get(0)
obtenez unInteger
objet.Integer
a déjà lacompareTo(anotherInteger)
méthode implémentée, vous n'avez pas à la définir.Réponse JAVA 8 et ci-dessus (à l'aide d'expressions Lambda)
Dans Java 8, des expressions Lambda ont été introduites pour rendre cela encore plus facile! Au lieu de créer un objet Comparator () avec tout son échafaudage, vous pouvez le simplifier comme suit: (en utilisant votre objet comme exemple)
ou même plus court:
Cette déclaration équivaut à ce qui suit:
Considérez les expressions Lambda comme vous obligeant uniquement à insérer les parties pertinentes du code: la signature de la méthode et ce qui est renvoyé.
Une autre partie de votre question était de savoir comment comparer avec plusieurs champs. Pour ce faire avec les expressions Lambda, vous pouvez utiliser la
.thenComparing()
fonction pour combiner efficacement deux comparaisons en une:Le code ci-dessus triera la liste d'abord par
timeStarted
, puis partimeEnded
(pour les enregistrements qui ont le mêmetimeStarted
).Une dernière remarque: il est facile de comparer les primitives «long» ou «int», vous pouvez simplement soustraire l'une de l'autre. Si vous comparez des objets («Long» ou «String»), je vous suggère d'utiliser leur comparaison intégrée. Exemple:
EDIT: Merci à Lukas Eder de m'avoir indiqué
.thenComparing()
fonctionner.la source
Comparator.comparing().thenComparing()
...Collections
plus, vous pouvez appeler directement sur la liste. Par exemple:myList.sort(Comparator.comparing(Address::getZipCode).thenComparing(Compartor.comparing(Address::getStreetName));
Nous pouvons trier la liste de deux manières:
1. Utilisation du comparateur : lorsque vous devez utiliser la logique de tri à plusieurs endroits Si vous souhaitez utiliser la logique de tri à un seul endroit, vous pouvez écrire une classe interne anonyme comme suit, ou bien extraire le comparateur et l'utiliser à plusieurs endroits
Nous pouvons avoir une vérification nulle pour les propriétés, si nous aurions pu utiliser «Long» au lieu de «long».
2. Utilisation de Comparable (ordre naturel) : Si l'algorithme de tri s'en tient toujours à une propriété: écrivez une classe qui implémente 'Comparable' et remplacez la méthode 'compareTo' comme défini ci-dessous
}
appelez la méthode de tri pour trier en fonction de l'ordre naturel
la source
En java8 +, cela peut être écrit en une seule ligne comme suit:
collectionObjec.sort(comparator_lamda)
oucomparator.comparing(CollectionType::getterOfProperty)
code:
ou
la source
Cela devrait vous donner une idée approximative. Une fois cela fait, vous pouvez appeler
Collections.sort()
sur la liste.la source
Depuis Java8, cela peut être fait encore plus proprement en utilisant une combinaison de
Comparator
etLambda expressions
Par exemple:
la source
De goyave ComparisonChain :
la source
Vous pouvez utiliser
Collections.sort
et transmettre le vôtreComparator<ActiveAlarm>
la source
En java, vous devez utiliser la
Collections.sort
méthode statique . Voici un exemple de liste d'objets CompanyRole, triés d'abord par begin, puis par end. Vous pouvez facilement vous adapter à votre propre objet.la source
Vous pouvez appeler Collections.sort () et transmettre un comparateur que vous devez écrire pour comparer différentes propriétés de l'objet.
la source
Comme mentionné, vous pouvez trier par:
Comparable
Comparator
àCollections.sort
Si vous faites les deux, le
Comparable
sera ignoré etComparator
sera utilisé. Cela permet que les objets de valeur aient leur propre logique,Comparable
qui est le tri le plus raisonnable pour votre objet de valeur, tandis que chaque cas d'utilisation individuel a sa propre implémentation.la source