J'ai une collection Java:
Collection<CustomObject> list = new ArrayList<CustomObject>();
CustomObject
a maintenant un champ id
avant la liste d'affichage. Je souhaite trier cette collection par id
.
Est-ce que je peux faire ça?
Utilisez un Comparateur :
List<CustomObject> list = new ArrayList<CustomObject>();
Comparator<CustomObject> comparator = new Comparator<CustomObject>() {
@Override
public int compare(CustomObject left, CustomObject right) {
return left.getId() - right.getId(); // use your logic
}
};
Collections.sort(list, comparator); // use the comparator as much as u want
System.out.println(list);
De plus, si CustomObject
implements Comparable
, utilisez simplement Collections.sort(list)
List<CustomObject> list = getCustomObjectList();
Collections.sort(list, (left, right) -> left.getId() - right.getId());
System.out.println(list);
Beaucoup plus simple
List<CustomObject> list = getCustomObjectList();
list.sort((left, right) -> left.getId() - right.getId());
System.out.println(list);
Le plus simple
List<CustomObject> list = getCustomObjectList();
list.sort(Comparator.comparing(CustomObject::getId));
System.out.println(list);
De toute évidence, le code initial peut également être utilisé pour JDK 8.
La question est: "Trier la collection". Donc, vous ne pouvez pas utiliser Collections.sort(List<T> l, Comparator<? super T> comparator)
.
Quelques conseils:
Pour le type de collection:
Comparator<String> defaultComparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
};
Collection<String> collection = getSomeStringCollection();
String[] strings = collection.toArray(new String[collection.size()]);
Arrays.sort(strings, defaultComparator);
List<String> sortedStrings = Arrays.asList(strings);
Collection<String> collection = getSomeStringCollection();
List<String> list = new ArrayList(collection);
Collections.sort(list, defaultComparator);
collection = list; // if you wish
Pour le type de liste:
List<String> list = getSomeStringList();
Collections.sort(list, defaultComparator);
Pour le type de set:
Set<String> set = getSomeStringSet();
// Than steps like in 'For Collection type' section or use Java.util.TreeSet
// TreeSet sample:
// Sorted using Java.lang.Comparable.
Set<String> naturalSorted = new TreeSet(set);
Set<String> set = getSomeStringSet();
Set<String> sortedSet = new TreeSet(defaultComparator);
sortedSet.addAll(set);
Version Java 8. Il y a Java.util.List#sort(Comparator<? super E> c)
méthode
List<String> list = getSomeStringList();
list.sort(defaultComparator);
ou
List<String> list = getSomeStringList();
list.sort((String o1, String o2) -> o1.compareTo(o2));
ou pour les types qui implémentent Comparable:
List<String> list = getSomeStringList();
list.sort(String::compareTo);
Un exemple légèrement différent, si vous avez une classe qui n'implémente pas Comparable mais que vous souhaitez toujours trier sur un champ ou une méthode.
Collections.sort(allMatching, new Comparator<ClassOne>() {
@Override public int compare(final ClassOne o1, final ClassOne o2) {
if (o1.getMethodToSort() > o2.getMethodToSort()) {
return 1;
} else if (o1.getMethodToSort() < o2.getMethodToSort()) {
return -1;
}
return 0;
}
});
Vous devez implémenter l'interface Comparator
.
exemple:
public class CustomComparator implements Comparator<CustomObject>
{
@Override
public int compare(CustomObject o1, CustomObject o2) {
return o1.getId().compareTo(o2.getId());
}
}
Ensuite, vous pouvez utiliser la méthode Collections de classes Collections.sort()
:
Collections.sort(list, new CustomComparator());
Implémentez l'interface Comparable sur votre customObject.
Beaucoup de réponses correctes, mais je n'ai pas trouvé celle-ci: Les collections ne peuvent pas être triées, vous pouvez seulement les parcourir.
Vous pouvez maintenant les parcourir et créer une nouvelle something
triée. Suivez les réponses ici pour cela.
Depuis Java 8, vous pouvez maintenant le faire avec un flux utilisant un lambda:
list.stream().sorted(Comparator.comparing(customObject::getId))
.foreach(object -> System.out.println(object));
Utilisez sort .
Vous devez juste faire ceci:
Tous les éléments de la liste doivent implémenter l'interface Comparable.
(Ou utilisez la version ci-dessous, comme d'autres l'ont déjà dit.)
Avec Java 8, vous avez plusieurs options, combinant des références de méthode et le comparateur intégré comparing
:
import static Java.util.Comparator.comparing;
Collection<CustomObject> list = new ArrayList<CustomObject>();
Collections.sort(list, comparing(CustomObject::getId));
//or
list.sort(comparing(CustomObject::getId));
SortedSet and Comparator. Le comparateur doit respecter le champ id.
Vous pouvez utiliser Java Custom Class à des fins de tri.