Een comparatorinterface wordt gebruikt om de objecten van door de gebruiker gedefinieerde klassen te ordenen. Een comparatorobject kan twee objecten van dezelfde klasse vergelijken . Volgende functie vergelijkt obj1 met obj2.
Syntaxis:
public int compare(Object obj1, Object obj2):>
Stel dat we een Array/ArrayList van ons eigen klassentype hebben, met daarin velden als rolnummer, naam, adres, geboortedatum, enz., en we moeten de array sorteren op basis van rolnummer of naam?
Methode 1 : Een voor de hand liggende aanpak is om onze eigen sort()-functie te schrijven met behulp van een van de standaardalgoritmen. Deze oplossing vereist het herschrijven van de hele sorteercode voor verschillende criteria zoals rolnummer en naam.
str.replace in Java
Methode 2: Een comparatorinterface gebruiken - De comparatorinterface wordt gebruikt om de objecten van een door de gebruiker gedefinieerde klasse te ordenen. Deze interface is aanwezig in het java.util-pakket en bevat twee methoden: Compare (Object obj1, Object obj2) en equals (Object-element). Met behulp van een comparator kunnen we de elementen sorteren op basis van gegevensleden. Het kan bijvoorbeeld het rolnummer, de naam, de leeftijd of iets anders zijn.
De klasse Method of Collections voor het sorteren van List-elementen wordt gebruikt om de elementen van List te sorteren op de gegeven comparator.
public void sort(List list, ComparatorClass c)>
Om een bepaalde lijst te sorteren, moet ComparatorClass een Comparator-interface implementeren.
Hoe werkt de sort()-methode van de klasse Collections?
Intern roept de Sort-methode de Compare-methode aan van de klassen die worden gesorteerd. Om twee elementen te vergelijken, wordt gevraagd: Wat is groter? De vergelijkingsmethode retourneert -1, 0 of 1 om aan te geven of deze kleiner dan, gelijk aan of groter is dan de andere. Het gebruikt dit resultaat om vervolgens te bepalen of ze moeten worden geruild voor hun soort.
Voorbeeld
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)); } }> |
>
>
Java-keuzelijstUitvoer
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>
Door de retourwaarde binnen de vergelijkingsmethode te wijzigen, kunt u in elke gewenste volgorde sorteren, bijvoorbeeld: Voor aflopende volgorde wijzigt u gewoon de posities van ‘a’ en ‘b’ in de bovenstaande vergelijkingsmethode.
Sorteer de collectie op meer dan één veld
In het vorige voorbeeld hebben we besproken hoe we de lijst met objecten kunnen sorteren op basis van een enkel veld met behulp van de Comparable en Comparator-interface. Maar wat als we de vereiste hebben om ArrayList-objecten te sorteren in overeenstemming met meer dan één veld, zoals eerst: sorteer op de naam van de student en ten tweede op de leeftijd van de student.
Voorbeeld
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);> >}> >}> }> |
>
>Uitvoer
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}>