Trier la Collection Java


J'ai une collection Java:

Collection<CustomObject> list = new ArrayList<CustomObject>();

CustomObject a un champ id maintenant avant la liste d'affichage, je veux trier cette collection par ce id.

Y a-t-il un moyen que je puisse faire cela?

Author: falsarella, 2011-08-05

13 answers

Utiliser 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 implémente Comparable, alors 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);

Plus Simple

List<CustomObject> list = getCustomObjectList();
list.sort(Comparator.comparing(CustomObject::getId));
System.out.println(list);

Évidemment, le code initial peut également être utilisé pour JDK 8.

 142
Author: Kowser, 2017-11-06 18:28:09

La question est: "Trier la collection". Vous ne pouvez donc 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 d'ensemble:

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);
 25
Author: Aliaksei Yatsau, 2015-05-14 14:14:09

Un exemple légèrement différent dit si vous avez une classe qui n'implémente pas Comparable mais que vous voulez toujours la 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
Author: Shawn Vader, 2011-08-05 14:28:45

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 classes Collections.sort():

Collections.sort(list, new CustomComparator());
 6
Author: Hunter McMillen, 2011-08-05 14:45:40

Implémentez l'interfaceComparable sur votre customObject.

 5
Author: DwB, 2011-08-05 14:12:10

Comparator est le chemin

Voir Aussi

 4
Author: Jigar Joshi, 2017-05-23 12:26:20

À partir de Java 8, vous pouvez maintenant le faire avec un flux en utilisant un lambda:

list.stream().sorted(Comparator.comparing(customObject::getId))
             .foreach(object -> System.out.println(object));
 3
Author: SebastianM., 2015-05-01 23:39:55

Utiliser tri.

Il Vous suffit de 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
Author: Ziyao Wei, 2011-08-05 14:11:09

Beaucoup de bonnes réponses, mais je n'ai pas trouvé celle-ci: Les collections ne peuvent pas être triées, vous ne pouvez que les parcourir.

Vous pouvez maintenant les parcourir et créer un nouveau something trié. Suivez les réponses ici pour cela.

 2
Author: estani, 2016-02-19 10:05:06

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
Author: assylias, 2015-06-12 12:26:03

SortedSet et Comparateur. Le comparateur doit respecter le champ id .

 0
Author: Aravind R. Yarram, 2011-08-05 14:10:41

Vous pouvez utiliser la classe personnalisée java dans le but de trier.

 0
Author: , 2017-11-15 10:10:41

Vous pouvez également utiliser:

Collections.sort(list, new Comparator<CustomObject>() {
    public int compare(CustomObject obj1, CustomObject obj2) {
        return obj1.id - obj2.id;
    }
});
System.out.println(list);
 -1
Author: Shrikant, 2015-06-26 06:56:27