Fortgeschrittene Sortiertechniken
In realen Anwendungen benötigen wir oft komplexere Sortierlogik, wie beispielsweise:
- Sortieren nach mehreren Kriterien (z.B. zuerst nach Durchschnittsnote (GPA) sortieren, und wenn die GPAs gleich sind, nach Namen sortieren)
- Sortieren in umgekehrter Reihenfolge
- Erstellen von benutzerdefinierten Vergleichsketten (Comparator Chains)
Lassen Sie uns diese fortgeschrittenen Techniken untersuchen.
Sortieren nach mehreren Kriterien
- Erstellen Sie eine neue Datei namens
MultiCriteriaDemo.java
im Verzeichnis ~/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);
}
}
}
Dieses Programm:
-
Erstellt eine Liste von Studenten, wobei einige die gleiche Durchschnittsnote (GPA) haben.
-
Erstellt einen Vergleicher (Comparator) für die GPA und einen für den Namen.
-
Kombiniert diese Vergleicher mithilfe der thenComparing()
-Methode.
-
Sortiert die Studenten zuerst nach ihrer GPA und dann nach ihrem Namen, wenn die GPAs gleich sind.
-
Kompilieren und führen Sie den Code aus:
cd ~/project
javac Student.java MultiCriteriaDemo.java
java MultiCriteriaDemo
Sie sollten eine Ausgabe ähnlich wie diese sehen:
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
Beachten Sie, dass Studenten mit der gleichen GPA (Alice und John mit 3.5, Bob und Mary mit 3.8) alphabetisch sortiert sind.
Sortieren in umgekehrter Reihenfolge
- Erstellen Sie eine neue Datei namens
ReverseOrderDemo.java
im Verzeichnis ~/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);
}
}
}
Dieses Programm zeigt zwei Möglichkeiten, in umgekehrter Reihenfolge zu sortieren:
-
Verwendung von Collections.reverseOrder()
zum Umkehren eines Vergleichers.
-
Verwendung der reversed()
-Methode eines Vergleichers.
-
Kompilieren und führen Sie den Code aus:
cd ~/project
javac Student.java ReverseOrderDemo.java
java ReverseOrderDemo
Sie sollten eine Ausgabe ähnlich wie diese sehen:
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
Die erste Sortierung zeigt die Studenten in absteigender Reihenfolge nach ihrer GPA, und die zweite Sortierung zeigt die Studenten in umgekehrter alphabetischer Reihenfolge nach ihrem Namen.
Komplexe Sortierkette
- Erstellen wir ein weiteres Beispiel, das mehrere Kriterien und umgekehrte Sortierung kombiniert. Erstellen Sie eine Datei namens
ComplexSortingDemo.java
im Verzeichnis ~/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);
}
}
}
Dieses Programm erstellt eine komplexe Sortierkette, die:
-
Zuerst die Studenten in absteigender Reihenfolge nach ihrer GPA sortiert.
-
Wenn die GPAs gleich sind, in aufsteigender Reihenfolge nach ihrem Namen sortiert.
-
Wenn sowohl die GPA als auch der Name gleich sind, in absteigender Reihenfolge nach ihrer Matrikelnummer sortiert.
-
Kompilieren und führen Sie den Code aus:
cd ~/project
javac Student.java ComplexSortingDemo.java
java ComplexSortingDemo
Sie sollten eine Ausgabe ähnlich wie diese sehen:
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
In dieser Ausgabe:
- Bob und Mary haben beide eine GPA von 3.8, aber Bob kommt alphabetisch zuerst.
- Alice und John haben beide eine GPA von 3.5, aber Alice kommt alphabetisch zuerst.
- Charlie und David haben beide eine GPA von 3.2, und Charlie kommt alphabetisch zuerst.
Dies zeigt, wie Sie komplexe, mehrstufige Sortierlogik durch Verkettung von Vergleichern erstellen können.