J'ai une liste d'objets comme. List<Object> p
Je veux trier cette liste par ordre alphabétique en utilisant le champ de nom d'objet. L'objet contient 10 champs et le champ de nom en est un.
if (list.size() > 0) {
Collections.sort(list, new Comparator<Campaign>() {
@Override
public int compare(final Object object1, final Object object2) {
return String.compare(object1.getName(), object2.getName());
}
} );
}
Mais il n'y a rien de tel que String.compare ..?
Object
s n'ont pas de noms. Voulez-vous dire utiliser.toString()
?object1
etobject2
doivent être de typeCampaign
, et la fonction de comparaison l'estobject1.getName().compareTo(object2.getName())
.List<Object>
etComparator<Campaign>
. Vous ne pouvez pas faire ça. Soit vous avezList<Object>
etComparator<Object>
ouList<Campaign>
etComparator<Campaign>
Réponses:
D'après votre code, il semble que votre
Comparator
soit déjà paramétré avecCampaign
. Cela ne fonctionnera qu'avecList<Campaign>
. De plus, la méthode que vous recherchez estcompareTo
.Ou si vous utilisez Java 1.8
Un dernier commentaire - il ne sert à rien de vérifier la taille de la liste. Le tri fonctionnera sur une liste vide.
la source
Comparator.comparing(Campaign::getName)
list.sort((object1, object2) -> object1. getName().compareTo(object2. getName()));
travaillé pour moisortedList = list.stream().sort((object1, object2) -> object1. getName().compareTo(object2. getName()))..collect(Collectors.toList());
pour obtenir une nouvelle liste triéeLa façon la plus correcte de trier les chaînes par ordre alphabétique consiste à utiliser
Collator
, en raison de l'internationalisation. Certaines langues ont un ordre différent en raison de quelques caractères supplémentaires, etc.Si vous ne vous souciez pas de l'utilisation de l'internationalisation
string.compare(otherString)
.la source
Jetez un œil à
Collections.sort()
et à l'Comparator
interface.La comparaison de chaînes peut être effectuée avec
object1.getName().compareTo(object2.getName())
ouobject2.getName().compareTo(object1.getName())
(selon le sens de tri souhaité).Si vous voulez que le tri soit indépendant du cas, faites-le
object1.getName().toUpperCase().compareTo(object2.getName().toUpperCase())
.la source
nama
duObject
type? cette réponse n'est pas complète.Utilisation de Java 8 Comparator.comparing :
la source
Veuillez remplacer Object par votre classe qui contient le champ de nom
Usage:
la source
obj1.getName().compareTo(obj2.getName()
parobj2.getName().compareTo(obj1.getName()
dans la classe de comparaisonquelque chose comme
la source
Voici une version de la réponse de Robert B qui fonctionne pour
List<T>
et trie par une propriété String spécifiée de l'objet en utilisant Reflection et aucune bibliothèque tiercela source
Vous pouvez utiliser à
sortThisBy()
partir des collections Eclipse :Si vous ne pouvez pas modifier le type de liste à partir de
List
:Remarque: je suis un contributeur aux collections Eclipse.
la source
Essaye ça:
la source
Si vos objets ont un ancêtre commun [que ce soit
T
], vous devriez utiliser à laList<T>
place deList<Object>
et implémenter un comparateur pour ce T, en utilisant le champ de nom.Si vous n'avez pas d'ancêtre commun, vous pouvez implémenter un Comperator et utiliser la réflexion pour extraire le nom, notez qu'il est dangereux, non suggéré et souffre de mauvaises performances pour utiliser la réflexion, mais cela vous permet d'accéder à un nom de champ sans rien savoir sur le type réel de l'objet [outre le fait qu'il a un champ avec le nom pertinent]
Dans les deux cas, vous devez utiliser Collections.sort () pour trier.
la source
J'ai trouvé une autre façon de faire le type.
la source
Ceci suppose une liste de
YourClass
au lieu deObject
, comme expliqué par amit .Vous pouvez utiliser ce bit de la bibliothèque Google Guava:
Les autres réponses qui mentionnent
Comparator
ne sont pas incorrectes, puisque desOrdering
outilsComparator
. Cette solution est, à mon avis, un peu plus simple, même si elle peut être plus difficile si vous êtes un débutant et que vous n'êtes pas habitué à utiliser des bibliothèques et / ou une "programmation fonctionnelle".Copié sans vergogne de cette réponse sur ma propre question.
la source
Utilisation d'une sélection Trier
la source
Collections.sort()
? (2) la liste est de typeList<Object>
et nelist.get(j).getName()
sera donc pas compilée. (3) cette solution est O (n ^ 2), en utilisantCollections.sort()
est une meilleure solution O (nlogn).Si vous utilisez un
List<Object>
pour contenir des objets d'un sous-type qui a un champ de nom (appelons le sous-typeNamedObject
), vous devrez réduire les éléments de la liste afin d'accéder au nom. Vous avez 3 options, dont la meilleure est la première:List<Object>
en premier lieu si vous pouvez l'aider - conservez vos objets nommés dans unList<NamedObject>
List<Object>
éléments dans unList<NamedObject>
, downcasting dans le processus, faites le tri, puis recopiez-lesL'option 3 ressemblerait à ceci:
la source
la source
La réponse de @ Victor a fonctionné pour moi et la republie ici à Kotlin au cas où cela serait utile à quelqu'un d'autre faisant Android.
la source