Rozhranie komparátora sa používa na usporiadanie objektov užívateľom definovaných tried. Objekt komparátora je schopný porovnať dva objekty rovnakej triedy . Nasledujúca funkcia porovnáva obj1 s obj2.
Syntax:
public int compare(Object obj1, Object obj2):>
Predpokladajme, že máme Array/ArrayList nášho vlastného typu triedy, ktorý obsahuje polia ako číslo rolky, meno, adresa, dátum narodenia atď., a potrebujeme pole zoradiť podľa čísla rolky alebo názvu?
Metóda 1 : Jedným zo zrejmých prístupov je napísať našu vlastnú funkciu sort() pomocou jedného zo štandardných algoritmov. Toto riešenie vyžaduje prepísanie celého triediaceho kódu pre rôzne kritériá, ako je číslo rolky a názov.
haldy triediť
Metóda 2: Použitie rozhrania komparátora – rozhranie komparátora sa používa na usporiadanie objektov užívateľom definovanej triedy. Toto rozhranie je prítomné v balíku java.util a obsahuje 2 metódy porovnanie (Object obj1, Object obj2) a equals (Object element). Pomocou komparátora môžeme prvky triediť na základe dátových členov. Môže to byť napríklad číslo roly, meno, vek alebo čokoľvek iné.
Metóda triedy Collections na triedenie prvkov List slúži na triedenie prvkov Zoznamu podľa daného komparátora.
public void sort(List list, ComparatorClass c)>
Na zoradenie daného zoznamu musí ComparatorClass implementovať rozhranie porovnávača.
Ako funguje metóda sort() triedy Collections?
Interne metóda Sort volá metódu Compare tried, ktoré triedi. Na porovnanie dvoch prvkov sa pýta, ktorý je väčší? Metóda Compare vráti hodnotu -1, 0 alebo 1, aby povedala, či je menšia, rovná alebo väčšia ako druhá. Tento výsledok potom použije na určenie, či by sa mali vymeniť za svoj druh.
Príklad
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)); } }> |
>
>Výkon
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>
Zmenou návratovej hodnoty v rámci porovnávacej metódy môžete triediť v ľubovoľnom poradí, napríklad: Pre zostupné poradie stačí zmeniť pozície „a“ a „b“ vo vyššie uvedenej porovnávacej metóde.
Zoradiť kolekciu podľa viac ako jedného poľa
V predchádzajúcom príklade sme diskutovali o tom, ako triediť zoznam objektov na základe jedného poľa pomocou rozhrania Comparable and Comparator Ale čo ak máme požiadavku triediť objekty ArrayList podľa viac ako jedného poľa, ako je po prvé, triediť podľa mena študenta a po druhé triediť podľa veku študenta.
Príklad
nat vs postel
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);> > }> > }> }> |
>
>Výkon
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}>