Eine Komparatorschnittstelle wird verwendet, um die Objekte benutzerdefinierter Klassen zu ordnen. Ein Komparatorobjekt ist in der Lage, zwei Objekte derselben Klasse zu vergleichen . Folgende Funktion vergleicht obj1 mit obj2.
Syntax:
public int compare(Object obj1, Object obj2):>
Angenommen, wir haben ein Array/ArrayList unseres eigenen Klassentyps, das Felder wie Rollennummer, Name, Adresse, Geburtsdatum usw. enthält, und wir müssen das Array basierend auf Rollennummer oder Name sortieren?
Methode 1 : Ein naheliegender Ansatz besteht darin, unsere eigene sort()-Funktion unter Verwendung eines der Standardalgorithmen zu schreiben. Diese Lösung erfordert das Umschreiben des gesamten Sortiercodes für verschiedene Kriterien wie Rollennummer und Name.
binärer Suchalgorithmus
Methode 2: Verwenden der Komparatorschnittstelle: Die Komparatorschnittstelle wird zum Ordnen der Objekte einer benutzerdefinierten Klasse verwendet. Diese Schnittstelle ist im Paket java.util vorhanden und enthält zwei Methoden: Compare (Object obj1, Object obj2) und equal (Object element). Mithilfe eines Komparators können wir die Elemente nach Datenelementen sortieren. Es kann sich beispielsweise um Rollennummer, Name, Alter oder irgendetwas anderes handeln.
Die Methode der Collections-Klasse zum Sortieren von Listenelementen wird verwendet, um die Elemente der Liste nach dem angegebenen Komparator zu sortieren.
public void sort(List list, ComparatorClass c)>
Um eine bestimmte Liste zu sortieren, muss ComparatorClass eine Comparator-Schnittstelle implementieren.
Wie funktioniert die Methode sort() der Collections-Klasse?
Intern ruft die Sort-Methode die Compare-Methode der Klassen auf, die sie sortiert. Um zwei Elemente zu vergleichen, wird gefragt: Welches ist größer? Die Vergleichsmethode gibt -1, 0 oder 1 zurück, um anzugeben, ob sie kleiner, gleich oder größer als die andere ist. Anhand dieses Ergebnisses wird dann bestimmt, ob sie entsprechend ihrer Sortierung ausgetauscht werden sollten.
Beispiel
Java
// Java Program to Demonstrate Working of> // Comparator Interface> // Importing required classes> import> java.io.*;> import> java.lang.*;> import> java.util.*;> // Class 1> // A class to represent a Student> class> Student {> >// Attributes of a student> >int> rollno;> >String name, address;> >// Constructor> >public> Student(>int> rollno, String name, String address)> >{> >// This keyword refers to current instance itself> >this>.rollno = rollno;> >this>.name = name;> >this>.address = address;> >}> >// Method of Student class> >// To print student details in main()> >public> String toString()> >{> >// Returning attributes of Student> >return> this>.rollno +>' '> +>this>.name +>' '> >+>this>.address;> >}> }> // Class 2> // Helper class implementing Comparator interface> class> Sortbyroll>implements> Comparator {> >// Method> >// Sorting in ascending order of roll number> >public> int> compare(Student a, Student b)> >{> >return> a.rollno - b.rollno;> >}> }> // Class 3> // Helper class implementing Comparator interface> class> Sortbyname>implements> Comparator {> >// Method> >// Sorting in ascending order of name> >public> int> compare(Student a, Student b)> >{> >return> a.name.compareTo(b.name);> >}> }> // Class 4> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String[] args)> >{> >// Creating an empty ArrayList of Student type> >ArrayList ar =>new> ArrayList();> >// Adding entries in above List> >// using add() method> >ar.add(>new> Student(>111>,>'Mayank'>,>'london'>));> >ar.add(>new> Student(>131>,>'Anshul'>,>'nyc'>));> >ar.add(>new> Student(>121>,>'Solanki'>,>'jaipur'>));> >ar.add(>new> Student(>101>,>'Aggarwal'>,>'Hongkong'>));> >// Display message on console for better readability> >System.out.println(>'Unsorted'>);> >// Iterating over entries to print them> >for> (>int> i =>0>; i System.out.println(ar.get(i)); // Sorting student entries by roll number Collections.sort(ar, new Sortbyroll()); // Display message on console for better readability System.out.println('
Sorted by rollno'); // Again iterating over entries to print them for (int i = 0; i System.out.println(ar.get(i)); // Sorting student entries by name Collections.sort(ar, new Sortbyname()); // Display message on console for better readability System.out.println('
Sorted by name'); // // Again iterating over entries to print them for (int i = 0; i System.out.println(ar.get(i)); } }> |
>
>Ausgabe
Unsorted 111 Mayank london 131 Anshul nyc 121 Solanki jaipur 101 Aggarwal Hongkong Sorted by rollno 101 Aggarwal Hongkong 111 Mayank london 121 Solanki jaipur 131 Anshul nyc Sorted by name 101 Aggarwal Hongkong 131 Anshul nyc 111 Mayank london 121 Solanki jaipur>
Durch Ändern des Rückgabewerts innerhalb der Vergleichsmethode können Sie in jeder gewünschten Reihenfolge sortieren, zum Beispiel: Für eine absteigende Reihenfolge ändern Sie einfach die Positionen von „a“ und „b“ in der obigen Vergleichsmethode.
Sammlung nach mehr als einem Feld sortieren
Im vorherigen Beispiel haben wir besprochen, wie die Liste der Objekte anhand eines einzelnen Felds mithilfe der Comparable- und Comparator-Schnittstelle sortiert wird. Was aber, wenn wir ArrayList-Objekte nach mehr als einem Feld sortieren müssen, wie zum Beispiel erstens? Sortieren Sie nach dem Namen des Schülers und zweitens nach dem Alter des Schülers.
Beispiel
Java
faktorielles Java
// Java Program to Demonstrate Working of> // Comparator Interface Via More than One Field> // Importing required classes> import> java.util.ArrayList;> import> java.util.Collections;> import> java.util.Comparator;> import> java.util.Iterator;> import> java.util.List;> // Class 1> // Helper class representing a Student> class> Student {> >// Attributes of student> >String Name;> >int> Age;> >// Parameterized constructor> >public> Student(String Name, Integer Age)> >{> >// This keyword refers to current instance itself> >this>.Name = Name;> >this>.Age = Age;> >}> >// Getter setter methods> >public> String getName() {>return> Name; }> >public> void> setName(String Name) {>this>.Name = Name; }> >public> Integer getAge() {>return> Age; }> >public> void> setAge(Integer Age) {>this>.Age = Age; }> >// Method> >// Overriding toString() method> >@Override> public> String toString()> >{> >return> 'Customer{'> >+>'Name='> + Name +>', Age='> + Age +>'}'>;> >}> }> // Class 2> // Helper class implementing Comparator interface> class> CustomerSortingComparator> >implements> Comparator {> >// Method 1> >// To compare customers> >@Override> >public> int> compare(Student customer1, Student customer2)> >{> >// Comparing customers> >int> NameCompare = customer1.getName().compareTo(> >customer2.getName());> >int> AgeCompare = customer1.getAge().compareTo(> >customer2.getAge());> >// 2nd level comparison> >return> (NameCompare ==>0>) ? AgeCompare> >: NameCompare;> >}> }> // Method 2> // Main driver method> class> GFG {> >public> static> void> main(String[] args)> >{> >// Create an empty ArrayList> >// to store Student> >List al =>new> ArrayList();> >// Create customer objects> >// using constructor initialization> >Student obj1 =>new> Student(>'Ajay'>,>27>);> >Student obj2 =>new> Student(>'Sneha'>,>23>);> >Student obj3 =>new> Student(>'Simran'>,>37>);> >Student obj4 =>new> Student(>'Ajay'>,>22>);> >Student obj5 =>new> Student(>'Ajay'>,>29>);> >Student obj6 =>new> Student(>'Sneha'>,>22>);> >// Adding customer objects to ArrayList> >// using add() method> >al.add(obj1);> >al.add(obj2);> >al.add(obj3);> >al.add(obj4);> >al.add(obj5);> >al.add(obj6);> >// Iterating using Iterator> >// before Sorting ArrayList> >Iterator custIterator = al.iterator();> >// Display message> >System.out.println(>'Before Sorting:
'>);> >// Holds true till there is single element> >// remaining in List> >while> (custIterator.hasNext()) {> >// Iterating using next() method> >System.out.println(custIterator.next());> >}> >// Sorting using sort method of Collections class> >Collections.sort(al,> >new> CustomerSortingComparator());> >// Display message only> >System.out.println(>'
After Sorting:
'>);> >// Iterating using enhanced for-loop> >// after Sorting ArrayList> >for> (Student customer : al) {> >System.out.println(customer);> >}> >}> }> |
>
>Ausgabe
Before Sorting: Customer{Name=Ajay, Age=27} Customer{Name=Sneha, Age=23} Customer{Name=Simran, Age=37} Customer{Name=Ajay, Age=22} Customer{Name=Ajay, Age=29} Customer{Name=Sneha, Age=22} After Sorting: Customer{Name=Ajay, Age=22} Customer{Name=Ajay, Age=27} Customer{Name=Ajay, Age=29} Customer{Name=Simran, Age=37} Customer{Name=Sneha, Age=22} Customer{Name=Sneha, Age=23}>