J'ai une classe nommée Person
avec plusieurs propriétés, par exemple:
public class Person {
private int id;
private String name, address;
// Many more properties.
}
Un grand nombre d' Person
objets sont stockés dans un fichier ArrayList<Person>
. Je veux trier cette liste par plusieurs paramètres de tri, et différents de temps en temps. Par exemple, je pourrais une fois vouloir trier par ordre name
croissant puis address
décroissant, et une autre fois simplement par id
décroissant.
Et je ne veux pas créer mes propres méthodes de tri (c'est-à-dire que je veux utiliser Collections.sort(personList, someComparator)
. Quelle est la solution la plus élégante qui permet d'y parvenir?
comparator.reversed()
pour la descente et vous pouvez utilisercomparator1.thenComparing(comparator2)
pour chaîner les comparateurs.Vous pouvez créer des comparateurs pour chacune des propriétés que vous voudrez peut-être trier, puis essayer le "chaînage de comparateurs" :-) comme ceci:
la source
Une façon est de créer un
Comparator
qui prend comme arguments une liste de propriétés à trier, comme le montre cet exemple.Il peut ensuite être utilisé dans le code par exemple comme ceci:
la source
Une approche consisterait à composer l'
Comparator
art. Cela pourrait être une méthode de bibliothèque (je suis sûr qu'elle existe quelque part).Utilisation:
Sinon, notez qu'il
Collections.sort
s'agit d'un tri stable. Si les performances ne sont pas absolument cruciales, vous triez dans l'ordre secondaire avant le primaire.la source
compose(nameComparator, compose(addressComparator, idComparator))
Cela se lirait un peu mieux si Java avait des méthodes d'extension.Les comparateurs vous permettent de le faire très facilement et naturellement. Vous pouvez créer des instances uniques de comparateurs, soit dans votre classe Person elle-même, soit dans une classe Service associée à votre besoin.
Exemples, utilisant des classes internes anonymes:
Si vous en avez beaucoup, vous pouvez également structurer le code de votre comparateur comme vous le souhaitez. Par exemple, vous pourriez:
la source
Je pense que coupler les trieurs à la classe Person, comme dans votre réponse, n'est pas une bonne idée, car cela couple la comparaison (généralement axée sur l'entreprise) et l'objet modèle pour se rapprocher l'un de l'autre. Chaque fois que vous souhaitez modifier / ajouter quelque chose au trieur, vous devez toucher la classe de personne, ce que vous ne voulez généralement pas faire.
Utiliser un service ou quelque chose de similaire, qui fournit des instances de comparateur, comme KLE proposé, semble beaucoup plus flexible et extensible.
la source
Mon approche est basée sur celle de Yishai. Le principal écart est qu'il n'y a aucun moyen de trier d'abord par ordre croissant pour un attribut et ensuite par ordre décroissant pour un autre. Cela ne peut pas être fait avec des énumérations. Pour cela, j'ai utilisé des cours. Parce que le SortOrder dépend fortement du type, j'ai préféré l'implémenter en tant que classe interne de personne.
La classe 'Person' avec la classe interne 'SortOrder':
Un exemple d'utilisation de la classe Person et de son SortOrder:
oRUMOo
la source
J'ai récemment écrit un comparateur pour trier plusieurs champs dans un enregistrement String délimité. Il vous permet de définir le délimiteur, la structure des enregistrements et les règles de tri (dont certaines sont spécifiques au type). Vous pouvez l'utiliser en convertissant un enregistrement Personne en une chaîne délimitée.
Les informations requises sont envoyées au comparateur lui-même, soit par programme, soit via un fichier XML.
XML est validé par un fichier XSD intégré au package. Par exemple, vous trouverez ci-dessous une mise en page d'enregistrement délimitée par des tabulations avec quatre champs (dont deux peuvent être triés):
Vous utiliseriez alors ceci en java comme ceci:
La bibliothèque peut être trouvée ici:
http://sourceforge.net/projects/multicolumnrowcomparator/
la source
Supposons qu'une classe
Coordinate
soit là et que l'on doive la trier dans les deux sens selon les coordonnées X et Y. Deux comparateurs différents sont nécessaires pour cela. Voici l'exemplela source