Techniques de tri avancées
Dans les applications du monde réel, nous avons souvent besoin d'une logique de tri plus complexe, comme :
- Trier par plusieurs critères (par exemple, trier par moyenne générale (GPA), et si les GPA sont égaux, trier par nom)
- Trier dans l'ordre inverse
- Créer des chaînes de comparateurs personnalisés
Explorons ces techniques avancées.
Tri par plusieurs critères
- Créez un nouveau fichier nommé
MultiCriteriaDemo.java
dans le répertoire ~/project
:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class MultiCriteriaDemo {
public static void main(String[] args) {
// Create a list of students with some having the same GPA
List<Student> students = new ArrayList<>();
students.add(new Student("John", 3.5, 101));
students.add(new Student("Mary", 3.8, 102));
students.add(new Student("Alice", 3.5, 103)); // Same GPA as John
students.add(new Student("Bob", 3.8, 104)); // Same GPA as Mary
students.add(new Student("Charlie", 3.2, 105));
// Print the unsorted list
System.out.println("Unsorted Student List:");
for (Student student : students) {
System.out.println(student);
}
// Sort first by GPA, then by name
Comparator<Student> byGpa = Comparator.comparing(Student::getGpa);
Comparator<Student> byName = Comparator.comparing(Student::getName);
// Combine the comparators using thenComparing
Comparator<Student> byGpaThenName = byGpa.thenComparing(byName);
// Sort the list
Collections.sort(students, byGpaThenName);
// Print the sorted list
System.out.println("\nStudents sorted by GPA, then by name:");
for (Student student : students) {
System.out.println(student);
}
}
}
Ce programme :
-
Crée une liste d'étudiants, certains ayant le même GPA
-
Crée un comparateur pour le GPA et un comparateur pour le nom
-
Combine ces comparateurs en utilisant la méthode thenComparing()
-
Trie les étudiants d'abord par GPA, puis par nom si les GPA sont égaux
-
Compilez et exécutez le code :
cd ~/project
javac Student.java MultiCriteriaDemo.java
java MultiCriteriaDemo
Vous devriez voir un résultat similaire à :
Unsorted Student List:
John, GPA: 3.5, Reg No: 101
Mary, GPA: 3.8, Reg No: 102
Alice, GPA: 3.5, Reg No: 103
Bob, GPA: 3.8, Reg No: 104
Charlie, GPA: 3.2, Reg No: 105
Students sorted by GPA, then by name:
Charlie, GPA: 3.2, Reg No: 105
Alice, GPA: 3.5, Reg No: 103
John, GPA: 3.5, Reg No: 101
Bob, GPA: 3.8, Reg No: 104
Mary, GPA: 3.8, Reg No: 102
Notez que les étudiants ayant le même GPA (Alice et John avec 3,5, Bob et Mary avec 3,8) sont triés par ordre alphabétique.
Tri dans l'ordre inverse
- Créez un nouveau fichier nommé
ReverseOrderDemo.java
dans le répertoire ~/project
:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ReverseOrderDemo {
public static void main(String[] args) {
// Create a list of students
List<Student> students = new ArrayList<>();
students.add(new Student("John", 3.5, 101));
students.add(new Student("Mary", 3.8, 102));
students.add(new Student("Alice", 3.2, 103));
students.add(new Student("Bob", 3.9, 104));
students.add(new Student("Charlie", 3.0, 105));
// Print the unsorted list
System.out.println("Unsorted Student List:");
for (Student student : students) {
System.out.println(student);
}
// Method 1: Using Collections.reverseOrder() with a comparator
Comparator<Student> byGpa = Comparator.comparing(Student::getGpa);
Comparator<Student> byGpaReversed = Collections.reverseOrder(byGpa);
Collections.sort(students, byGpaReversed);
System.out.println("\nStudents sorted by GPA in descending order (Method 1):");
for (Student student : students) {
System.out.println(student);
}
// Method 2: Using the reversed() method of Comparator
Collections.sort(students, Comparator.comparing(Student::getName).reversed());
System.out.println("\nStudents sorted by name in reverse alphabetical order (Method 2):");
for (Student student : students) {
System.out.println(student);
}
}
}
Ce programme démontre deux façons de trier dans l'ordre inverse :
-
Utiliser Collections.reverseOrder()
pour inverser un comparateur
-
Utiliser la méthode reversed()
d'un comparateur
-
Compilez et exécutez le code :
cd ~/project
javac Student.java ReverseOrderDemo.java
java ReverseOrderDemo
Vous devriez voir un résultat similaire à :
Unsorted Student List:
John, GPA: 3.5, Reg No: 101
Mary, GPA: 3.8, Reg No: 102
Alice, GPA: 3.2, Reg No: 103
Bob, GPA: 3.9, Reg No: 104
Charlie, GPA: 3.0, Reg No: 105
Students sorted by GPA in descending order (Method 1):
Bob, GPA: 3.9, Reg No: 104
Mary, GPA: 3.8, Reg No: 102
John, GPA: 3.5, Reg No: 101
Alice, GPA: 3.2, Reg No: 103
Charlie, GPA: 3.0, Reg No: 105
Students sorted by name in reverse alphabetical order (Method 2):
Mary, GPA: 3.8, Reg No: 102
John, GPA: 3.5, Reg No: 101
Charlie, GPA: 3.0, Reg No: 105
Bob, GPA: 3.9, Reg No: 104
Alice, GPA: 3.2, Reg No: 103
Le premier tri affiche les étudiants dans l'ordre décroissant de leur GPA, et le deuxième tri affiche les étudiants dans l'ordre alphabétique inverse de leur nom.
Chaîne de tri complexe
- Créons un autre exemple qui combine plusieurs critères et un tri inverse. Créez un fichier nommé
ComplexSortingDemo.java
dans le répertoire ~/project
:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ComplexSortingDemo {
public static void main(String[] args) {
// Create a list of students with varied data
List<Student> students = new ArrayList<>();
students.add(new Student("John", 3.5, 101));
students.add(new Student("Mary", 3.8, 102));
students.add(new Student("Alice", 3.5, 103)); // Same GPA as John
students.add(new Student("Bob", 3.8, 104)); // Same GPA as Mary
students.add(new Student("Charlie", 3.2, 105));
students.add(new Student("David", 3.2, 106)); // Same GPA as Charlie
// Print the unsorted list
System.out.println("Unsorted Student List:");
for (Student student : students) {
System.out.println(student);
}
// Create a complex sorting chain:
// 1. Sort by GPA in descending order
// 2. If GPAs are equal, sort by name in ascending order
// 3. If names are also equal, sort by registration number in descending order
Comparator<Student> complexComparator = Comparator
.comparing(Student::getGpa, Comparator.reverseOrder())
.thenComparing(Student::getName)
.thenComparing(Student::getRegNo, Comparator.reverseOrder());
Collections.sort(students, complexComparator);
System.out.println("\nStudents sorted by complex criteria:");
System.out.println("(GPA descending, then name ascending, then reg. number descending)");
for (Student student : students) {
System.out.println(student);
}
}
}
Ce programme crée une chaîne de tri complexe qui :
-
Trie d'abord les étudiants par GPA dans l'ordre décroissant
-
Si les GPA sont égaux, trie par nom dans l'ordre croissant
-
Si le GPA et le nom sont également égaux, trie par numéro d'inscription dans l'ordre décroissant
-
Compilez et exécutez le code :
cd ~/project
javac Student.java ComplexSortingDemo.java
java ComplexSortingDemo
Vous devriez voir un résultat similaire à :
Unsorted Student List:
John, GPA: 3.5, Reg No: 101
Mary, GPA: 3.8, Reg No: 102
Alice, GPA: 3.5, Reg No: 103
Bob, GPA: 3.8, Reg No: 104
Charlie, GPA: 3.2, Reg No: 105
David, GPA: 3.2, Reg No: 106
Students sorted by complex criteria:
(GPA descending, then name ascending, then reg. number descending)
Bob, GPA: 3.8, Reg No: 104
Mary, GPA: 3.8, Reg No: 102
Alice, GPA: 3.5, Reg No: 103
John, GPA: 3.5, Reg No: 101
Charlie, GPA: 3.2, Reg No: 105
David, GPA: 3.2, Reg No: 106
Dans ce résultat :
- Bob et Mary ont tous deux un GPA de 3,8, mais Bob vient en premier par ordre alphabétique
- Alice et John ont tous deux un GPA de 3,5, mais Alice vient en premier par ordre alphabétique
- Charlie et David ont tous deux un GPA de 3,2, et Charlie vient en premier par ordre alphabétique
Cela démontre comment vous pouvez créer une logique de tri complexe et multi-niveaux en enchaînant des comparateurs.