Comment trier les objets de la Collection en Java ?
Trier les objets de la Collection
- Ce concept est lié au tri et nous allons voir ici comment trier les objets sur la Collection ?
- En Java, nous avons des collections de classes utilitaires qui fournissent diverses méthodes pour effectuer diverses tâches et l'une des méthodes de la classe Collection est liée au tri comme sort().
- Nous pouvons implémenter le tri sur l'objet Collection de deux manières :
- En utilisant Comparable
- En utilisant le comparateur
- Lorsque nous appelons Collections.sort(). Il trie un objet en fonction du tri naturel ou du tri par défaut (c'est-à-dire l'ordre croissant) spécifié dans la méthode compareTo().
- Lorsque nous appelons Collections.sort(Comparator). Il trie un objet en fonction d'un tri personnalisé (c'est-à-dire ordre croissant ou ordre décroissant) spécifié dans la méthode compare() de Comparator.
Nous verrons les manières de trier une par une...
1) En utilisant le comparateur
- Si nous passons l'objet Comparator dans le constructeur de la classe Collection, notre méthode compare() sera exécutée.
- Lorsque nous voulons personnaliser le tri, nous devons opter pour Comparator.
- Il est possible d'implémenter un tri personnalisé en utilisant l'interface Comparator. (Le tri personnalisé signifie que selon notre besoin, qu'il soit ascendant ou descendant).
Exemple :
import java.util.*; class TreeSetClass { public static void main(String[] args) { // Here we are passing Comparator object in Collection // class constructor for custoize sorting TreeSet ts = new TreeSet(new CustomizeSorting()); // adding elements to TreeSet ts.add(10); ts.add(40); ts.add(30); ts.add(20); // Customized Sorted List System.out.println("Customize sorting :" + ts); } } // Here we are implementing Comparator interface class CustomizeSorting implements Comparator { // Here we are overrding compare() method of Comparator public int compare(Object obj1, Object obj2) { Integer i1 = (Integer) obj1; Integer i2 = (Integer) obj2; return -i1.compareTo(i2); } }
Sortie
E:\Programs>javac TreeSetClass.java E:\Programs>java TreeSetClass Customize sorting :[40, 30, 20, 10]
2) En utilisant une interface comparable
- Pour les classes comparables prédéfinies, le tri naturel par défaut est déjà disponible.
- Pour les classes non comparables prédéfinies, le tri naturel par défaut n'est pas encore disponible.
- Pour que nos classes personnalisées définissent le tri naturel, nous devrions opter pour Comparable.
- En cas de tri naturel par défaut, l'objet obligatoire doit être homogène et comparable, sinon nous obtiendrons CCE (ClassCastException).
Exemple :
import java.util.*; class TreeSetClass { public static void main(String[] args) { Student s1 = new Student(10); Student s2 = new Student(30); Student s3 = new Student(70); Student s4 = new Student(20); // Here we are not passing Comparator object in Collection // class constructor for default sorting TreeSet ts = new TreeSet(); // adding elements to TreeSet ts.add(s1); ts.add(s2); ts.add(s3); ts.add(s4); // Customized Sorted List System.out.println("Default sorting :" + ts); } } // Here we are implementing Comparable interface class Student implements Comparable { int code; Student(int code) { this.code = code; } public String toString() { return " Code - " + code; } // Here we are overrding compare() method of Comparable interface public int compareTo(Object obj) { int code1 = this.code; Student intermediate = (Student) obj; int code2 = intermediate.code; if (code1 < code2) return -1; else if (code1 > code2) return +1; else return 0; } }
Sortie
E:\Programs>javac TreeSetClass.java E:\Programs>java TreeSetClass Default sorting :[ Code - 10, Code - 20, Code - 30, Code - 70]