web-dev-qa-db-fra.com

Trier la collection Java

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? 

69
Makky

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 CustomObjectimplements Comparable, utilisez simplement Collections.sort(list)

Avec JDK 8, la syntaxe est beaucoup plus simple.

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.

146
Kowser

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);
27
Aliaksei Yatsau

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;
  }
});
11
Shawn Vader

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());
6
Hunter McMillen

Implémentez l'interface Comparable sur votre customObject. 

5
DwB

Comparator est le chemin

Regarde aussi 

4
Jigar Joshi

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.

4
estani

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));
3
SebastianM.

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.)

2
Ziyao Wei

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));
1
assylias

SortedSet and Comparator. Le comparateur doit respecter le champ id.

0
Aravind R. Yarram

Vous pouvez utiliser Java Custom Class à des fins de tri.

0
user7225794