J'ai lu sur le tri des listes de tableaux à l'aide d'un comparateur, mais dans tous les exemples que les gens ont utilisés compareTo
qui, selon certaines recherches, est une méthode pour les chaînes.
Je voulais trier une ArrayList d'objets personnalisés selon l'une de leurs propriétés: un objet Date ( getStartDay()
). Normalement, je les compare par item1.getStartDate().before(item2.getStartDate())
donc je me demandais si je pouvais écrire quelque chose comme:
public class CustomComparator {
public boolean compare(Object object1, Object object2) {
return object1.getStartDate().before(object2.getStartDate());
}
}
public class RandomName {
...
Collections.sort(Database.arrayList, new CustomComparator);
...
}
java
sorting
date
comparator
Samuel
la source
la source
Réponses:
Depuis
Date
implémenteComparable
, il a unecompareTo
méthode commeString
fait.Ainsi, votre coutume
Comparator
pourrait ressembler à ceci:La
compare()
méthode doit renvoyer unint
, vous ne pouvez donc pas retourner directement unboolean
comme vous l'aviez prévu de toute façon.Votre code de tri serait à peu près comme vous l'avez écrit:
Une manière légèrement plus courte d'écrire tout cela, si vous n'avez pas besoin de réutiliser votre comparateur, est de l'écrire en tant que classe anonyme en ligne:
Depuis java-8
Vous pouvez maintenant écrire le dernier exemple sous une forme plus courte en utilisant une expression lambda pour
Comparator
:Et
List
a unesort(Comparator)
méthode, vous pouvez donc raccourcir encore plus:C'est un idiome si courant qu'il existe une méthode intégrée pour générer un
Comparator
pour une classe avec uneComparable
clé:Tous ces éléments sont des formes équivalentes.
la source
int
et que vous feriez mieux d'utiliserDate#compareTo()
pour cela. Pourquoi ce n'est pas voté au-dessus de l'autre réponse me dépasse. Ce lien peut également être utile: Tutoriel de commande d'objets sur Sun.com .List.sort()
.Les classes qui ont un ordre de tri naturel (un numéro de classe, par exemple) doivent implémenter l'interface Comparable, tandis que les classes qui n'ont pas d'ordre de tri naturel (un président de classe, par exemple) doivent être fournies avec un comparateur (ou un comparateur anonyme) classe).
Deux exemples:
Usage:
la source
public
devantclass
.Pour trier un,
ArrayList
vous pouvez utiliser l'extrait de code suivant:la source
Oui, vous pouvez. Il existe deux options de comparaison des éléments, l' interface Comparable et l' interface Comparateur .
Ces deux interfaces permettent un comportement différent. Comparable vous permet de faire en sorte que l'objet agisse comme vous venez de décrire Strings (en fait, String implémente Comparable). Le second, Comparateur, vous permet de faire ce que vous demandez de faire. Vous le feriez comme ceci:
Cela entraînera la méthode Collections.sort à utiliser votre comparateur pour son mécanisme de tri. Si les objets dans ArrayList implémentent des éléments comparables, vous pouvez à la place faire quelque chose comme ceci:
La classe Collections contient un certain nombre de ces outils communs utiles.
la source
Expression lambda JAVA 8
OU
la source
Collections.sort(studList, Comparator.comparing(Student::getFirstName));
studList.sort(Comparator.comparing(Student::getFirstName));
Avec Java 8, vous pouvez utiliser une référence de méthode pour votre comparateur:
la source
Comme les technologies apparaissent tous les jours, la réponse changera dans le temps. J'ai jeté un œil à LambdaJ et semble très intéressant.
Vous pouvez essayer de résoudre ces tâches avec LambdaJ . Vous pouvez le trouver ici: http://code.google.com/p/lambdaj/
Voici un exemple:
Tri itératif
Trier avec lambda
Bien sûr, ce type de beauté a un impact sur les performances (en moyenne 2 fois), mais pouvez-vous trouver un code plus lisible?
la source
la source
Le meilleur moyen simple avec JAVA 8 est le tri alphabétique anglais
Implémentation de classe
Trier
Si vous souhaitez trier pour un alphabet contenant des caractères non anglais, vous pouvez utiliser les paramètres régionaux ... Sous le code, utilisez le tri des caractères turcs ...
Implémentation de classe
Trier
la source
Référence des fonctions et des méthodes
La
Collections.sort
méthode peut trier un enList
utilisant un queComparator
vous passez. CelaComparator
peut être implémenté en utilisant laComparator.comparing
méthode où vous pouvez passer une référence de méthode comme nécessaireFunction
. Heureusement, le code réel est beaucoup plus simple et plus court que cette description.Pour Java 8:
ou
Une autre façon est
la source
À
Java 8
partir de maintenant, nous n'avons pas à utiliserCollections.sort()
directement.List
l'interface a unesort()
méthode par défaut :Voir http://visvv.blogspot.in/2016/01/sorting-objects-in-java-8.html .
la source
Java 8 Lambda raccourcit le tri.
la source
Collections.sort(stdList, Comparator.comparing(SomeClass::getName));
Vous pouvez utiliser le comparateur de beans pour trier sur n'importe quelle propriété de votre classe personnalisée.
la source
Oui, c'est possible par exemple dans cette réponse je trie par la propriété
v
de la classeIndexValue
Si vous remarquez ici, je crée une classe interne anonyme (qui est le Java pour les fermetures) et je la transmets directement à la
sort
méthode de la classeArrays
Votre objet peut également implémenter
Comparable
(c'est ce que fait String et la plupart des bibliothèques de base de Java), mais cela définirait "l'ordre de tri naturel" de la classe elle-même, et ne vous permet pas d'en insérer de nouvelles.la source
Comparator
:)J'ai trouvé la plupart sinon toutes ces réponses reposent sur la classe sous-jacente (Object) pour implémenter comparable ou pour avoir une interface comparable d'assistance.
Pas avec ma solution! Le code suivant vous permet de comparer le champ d'un objet en connaissant son nom de chaîne. Vous pouvez facilement le modifier pour ne pas utiliser le nom, mais vous devez ensuite l'exposer ou construire l'un des objets que vous souhaitez comparer.
la source
Vous pouvez essayer la commande de goyave :
la source
Vous pouvez trier à l'aide de java 8
la source
Ces extraits de code peuvent être utiles. Si vous voulez trier un objet dans mon cas, je veux trier par VolumeName:
Cela marche. Je l'utilise dans mon jsp.
la source
Avec cette bibliothèque ici, vous pouvez trier la liste des objets personnalisés sur plusieurs colonnes. La bibliothèque utilise les fonctionnalités de la version 8.0. Un échantillon y est également disponible. Voici un exemple à faire
la source
Vous pouvez jeter un œil à cette présentation au Java Forum de Stuttgart en Allemagne en 2016.
Seules quelques diapositives utilisent la langue allemande, 99% du contenu est du code source Java "basé sur l'anglais"; comme
où
OurCustomComparator
utilise des méthodes par défaut (et d'autres idées intéressantes). Comme indiqué, conduisant à un code très concis pour choisir une méthode getter pour le tri; et enchaînement (ou inversion) super simple des critères de tri.Si vous aimez java8, vous y trouverez beaucoup de matériel pour vous aider à démarrer.
la source
Nouveau depuis 1.8 est une méthode List.sort () au lieu d'utiliser Collection.sort (), donc vous appelez directement mylistcontainer.sort ()
Voici un extrait de code qui illustre la fonctionnalité List.sort ():
La classe Fruit est:
la source
votre classe customComparator doit implémenter java.util.Comparator pour être utilisée. il doit également remplacer compare () ET égal ()
compare () doit répondre à la question: l'objet 1 est-il inférieur, égal ou supérieur à l'objet 2?
documents complets: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html
la source
Je préfère ce processus:
Si votre liste d'objets a une propriété appelée
startDate
, vous appelez cette fonction encore et encore. Vous pouvez même les enchaînerstartDate.time
.Cela nécessite votre objet à
Comparable
qui signifie que vous avez besoin d' unecompareTo
,equals
et lahashCode
mise en œuvre.Oui, cela pourrait être plus rapide ... Mais maintenant, vous n'avez plus besoin de faire un nouveau comparateur pour chaque type de tri. Si vous pouvez économiser du temps de développement et renoncer à l'exécution, vous pouvez opter pour celui-ci.
la source
À l'aide de Java 8, l'utilisation peut définir le
Comparator
sur une seule ligne en utilisantComparator.comparing()
Utilisez l'une des méthodes suivantes:
Option 1:
Option 2:
la source
Votre classe personnalisée peut implémenter l'interface "Comparable", qui nécessite une implémentation de la méthode CompareTo. Dans la méthode CompareTo, vous pouvez ensuite définir ce que signifie qu’un objet est inférieur ou supérieur à l'autre objet. Donc, dans votre exemple, cela peut ressembler à ceci:
..........
Un nombre négatif indique que cette c'est plus petite que l'objet en cours par rapport à. Un nombre positif indique que c'est plus grand que le rapport à l' objet et un moyen de zéro que les objets sont égaux.
Vous pouvez ensuite utiliser collections.sort (myList) pour trier votre liste sans avoir à alimenter un comparateur. Cette méthode présente également l'avantage de trier automatiquement les éléments si vous utilisez des structures de données de collection triées comme un TreeSet ou un TreeMap.
Vous pouvez consulter cet article si vous souhaitez en savoir plus sur l'interface comparable (divulgation: je suis l'auteur;)) https://nullbeans.com/the-java-comparable-interface-automatic-sort-of-collections/
la source
Vous pouvez également utiliser Springs PropertyComparator si vous n'avez qu'un chemin de propriété String vers la propriété (imbriquée) que vous souhaitez trier:
L'inconvénient est que ce comparateur ignore silencieusement les propriétés qui n'existent pas ou ne sont pas accessibles et les traite comme une valeur nulle pour la comparaison. Cela signifie que vous devez soigneusement tester un tel comparateur ou valider d'une manière ou d'une autre l'existence du chemin de propriété.
la source
en utilisant l'api java-8 stream, vous pouvez trier un
ArrayList
par:la source
J'ai essayé de nombreuses solutions différentes disponibles sur Internet, mais une solution qui fonctionne pour moi est disponible au lien ci-dessous.
https://www.java67.com/2017/07/how-to-sort-arraylist-of-objects-using.html
la source