logo

Java Comparator sučelje

Java Comparator sučelje koristi se za naručivanje objekata korisnički definirane klase.

Ovo se sučelje nalazi u paketu java.util i sadrži 2 metode compare(Object obj1,Object obj2) i equals(Object element).

Omogućuje više sekvenci sortiranja, tj. možete sortirati elemente na temelju bilo kojeg člana podatka, na primjer, rollno, ime, dob ili bilo što drugo.

Metode Java Comparator sučelja

metodaOpis
public int compare(Object obj1, Object obj2)Uspoređuje prvi objekt s drugim objektom.
public boolean equals (Object obj)Koristi se za usporedbu trenutnog objekta s navedenim objektom.
public boolean equals (Object obj)Koristi se za usporedbu trenutnog objekta s navedenim objektom.

Klasa zbirki

Zbirke klasa pruža statičke metode za sortiranje elemenata zbirke. Ako su elementi zbirke Set ili Map, možemo koristiti TreeSet ili TreeMap. Međutim, ne možemo sortirati elemente popisa. Klasa Collections također nudi metode za sortiranje elemenata tipa List.

Metoda klase Collections za sortiranje List elemenata

public void sort (List list, Comparator c): koristi se za sortiranje elemenata liste prema zadanom usporedniku.


Primjer Java komparatora (negenerički stari stil)

Pogledajmo primjer sortiranja elemenata Liste na temelju dobi i imena. U ovom primjeru stvorili smo 4 java klase:

  1. Student.java
  2. AgeComparator.java
  3. Usporednik imena.java
  4. Jednostavno.java
Student.java

Ova klasa sadrži tri polja rollno, name i age i parametrizirani konstruktor.

 class Student{ int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } } 
AgeComparator.java

Ova klasa definira logiku usporedbe na temelju dobi. Ako je starost prvog objekta veća od starosti drugog, vraćamo pozitivnu vrijednost. To može biti bilo koji, primjerice 1, 2, 10. Ako je starost prvog objekta manja od starosti drugog objekta, vraćamo negativnu vrijednost, to može biti bilo koja negativna vrijednost, a ako je starost oba objekta jednaka, vraćamo 0.

 import java.util.*; class AgeComparator implements Comparator{ public int compare(Object o1,Object o2){ Student s1=(Student)o1; Student s2=(Student)o2; if(s1.age==s2.age) return 0; else if(s1.age>s2.age) return 1; else return -1; } } 
Usporednik imena.java

Ova klasa pruža logiku usporedbe na temelju naziva. U tom slučaju koristimo metodu compareTo() klase String, koja interno osigurava logiku usporedbe.

 import java.util.*; class NameComparator implements Comparator{ public int compare(Object o1,Object o2){ Student s1=(Student)o1; Student s2=(Student)o2; return s1.name.compareTo(s2.name); } } 
Jednostavno.java

U ovoj klasi ispisujemo vrijednosti objekta sortiranjem na temelju imena i starosti.

 import java.util.*; import java.io.*; class Simple{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,'Jai',21)); System.out.println('Sorting by Name'); Collections.sort(al,new NameComparator()); Iterator itr=al.iterator(); while(itr.hasNext()){ Student st=(Student)itr.next(); System.out.println(st.rollno+' '+st.name+' '+st.age); } System.out.println('Sorting by age'); Collections.sort(al,new AgeComparator()); Iterator itr2=al.iterator(); while(itr2.hasNext()){ Student st=(Student)itr2.next(); System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Sorting by Name 106 Ajay 27 105 Jai 21 101 Vijay 23 Sorting by age 105 Jai 21 101 Vijay 23 106 Ajay 27 

Primjer Java komparatora (generički)

Student.java
 class Student{ int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } } 
AgeComparator.java
 import java.util.*; class AgeComparator implements Comparator{ public int compare(Student s1,Student s2){ if(s1.age==s2.age) return 0; else if(s1.age>s2.age) return 1; else return -1; } } 
Usporednik imena.java

Ova klasa pruža logiku usporedbe na temelju naziva. U tom slučaju koristimo metodu compareTo() klase String, koja interno osigurava logiku usporedbe.

 import java.util.*; class NameComparator implements Comparator{ public int compare(Student s1,Student s2){ return s1.name.compareTo(s2.name); } } 
Jednostavno.java

U ovoj klasi ispisujemo vrijednosti objekta sortiranjem na temelju imena i starosti.

 import java.util.*; import java.io.*; class Simple{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,'Jai',21)); System.out.println('Sorting by Name'); Collections.sort(al,new NameComparator()); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } System.out.println('Sorting by age'); Collections.sort(al,new AgeComparator()); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Sorting by Name 106 Ajay 27 105 Jai 21 101 Vijay 23 Sorting by age 105 Jai 21 101 Vijay 23 106 Ajay 27 

Sučelje Java 8 Comparator

Sučelje Java 8 Comparator je funkcionalno sučelje koje sadrži samo jednu apstraktnu metodu. Sada možemo koristiti sučelje Comparator kao cilj dodjele za lambda izraz ili referencu metode.

Metode sučelja Java 8 Comparator

metodaOpis
int usporedi(T o1, T o2)Uspoređuje prvi objekt s drugim objektom.
statičkiUsporedba komparatora (Function keyExtractor)Prihvaća funkciju koja izdvaja Comparable ključ sortiranja iz tipa T i vraća Comparator koji uspoređuje prema tom ključu sortiranja.
usporedba statičkog komparatora (Function keyExtractor, Comparator keyComparator)Prihvaća funkciju koja izvlači ključ sortiranja iz tipa T i vraća komparator koji uspoređuje po tom ključu sortiranja koristeći navedeni komparator.
statički komparator comparingDouble(ToDoubleFunction keyExtractor)Prihvaća funkciju koja izvlači dvostruki ključ sortiranja iz tipa T i vraća Comparator koji uspoređuje prema tom ključu sortiranja.
statički komparator comparingInt(ToIntFunction keyExtractor)Prihvaća funkciju koja izvlači int ključ za sortiranje iz tipa T i vraća Comparator koji uspoređuje po tom ključu za sortiranje.
statički komparator comparingLong(ToLongFunction keyExtractor)Prihvaća funkciju koja izvlači dugi ključ za sortiranje iz tipa T i vraća Comparator koji uspoređuje po tom ključu za sortiranje.
Boolean jednako (Object obj)Koristi se za usporedbu trenutnog objekta s navedenim objektom.
statičkiUsporednik naturalOrder()Vraća komparator koji uspoređuje usporedive objekte u prirodnom redoslijedu.
statički komparator nullsFirst(komparator komparator)Vraća komparator koji tretira null kao manje od elemenata koji nisu null.
statički komparator nullsLast(komparator komparator)Vraća komparator koji tretira null kao veći od elemenata koji nisu nul.
zadani komparator obrnut()Vraća komparator koji sadrži obrnuti poredak navedenog komparatora.
statičkiUsporednik reverseOrder()Vraća komparator koji sadrži obrnuti redoslijed od prirodnog.
default Comparator thenComparing(Comparator other)Vraća komparator leksikografskog reda s drugim komparatorom.
zadanoKomparator zatim Usporedba (Function keyExtractor)Vraća komparator leksikografskog reda s funkcijom koja izdvaja ključ sortiranja Usporedivo.
default Comparator thenComparing(Function keyExtractor, Comparator keyComparator)Vraća usporednik leksikografskog reda s funkcijom koja izdvaja ključ koji se uspoređuje s danim usporednikom.
default Comparator thenComparingDouble(ToDoubleFunction keyExtractor)Vraća komparator leksikografskog reda s funkcijom koja izdvaja ključ dvostrukog sortiranja.
default Comparator thenComparingInt(ToIntFunction keyExtractor)Vraća komparator leksikografskog reda s funkcijom koja izdvaja int ključ sortiranja.
default Comparator thenComparingLong(ToLongFunction keyExtractor)Vraća komparator leksikografskog reda s funkcijom koja izdvaja dugi ključ sortiranja.

Primjer Java 8 komparatora

Pogledajmo primjer sortiranja elemenata Liste na temelju dobi i imena.

Datoteka: Student.java

 class Student { int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } public int getRollno() { return rollno; } public void setRollno(int rollno) { this.rollno = rollno; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 

Datoteka: TestSort1.java

 import java.util.*; public class TestSort1{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,'Jai',21)); //Sorting elements on the basis of name Comparator cm1=Comparator.comparing(Student::getName); Collections.sort(al,cm1); System.out.println('Sorting by Name'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } //Sorting elements on the basis of age Comparator cm2=Comparator.comparing(Student::getAge); Collections.sort(al,cm2); System.out.println('Sorting by Age'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Sorting by Name 106 Ajay 27 105 Jai 21 101 Vijay 23 Sorting by Age 105 Jai 21 101 Vijay 23 106 Ajay 27 

Primjer Java 8 komparatora: metode nullsFirst() i nullsLast().

Ovdje sortiramo popis elemenata koji također sadrži null.

Datoteka: Student.java

 class Student { int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } public int getRollno() { return rollno; } public void setRollno(int rollno) { this.rollno = rollno; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 

Datoteka: TestSort2.java

 import java.util.*; public class TestSort2{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,null,21)); Comparator cm1=Comparator.comparing(Student::getName,Comparator.nullsFirst(String::compareTo)); Collections.sort(al,cm1); System.out.println('Considers null to be less than non-null'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } Comparator cm2=Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo)); Collections.sort(al,cm2); System.out.println('Considers null to be greater than non-null'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Considers null to be less than non-null 105 null 21 106 Ajay 27 101 Vijay 23 Considers null to be greater than non-null 106 Ajay 27 101 Vijay 23 105 null 21