logo

Rozhranie Java Comparator

Rozhranie Java Comparator sa používa na usporiadanie objektov užívateľom definovanej triedy.

Toto rozhranie sa nachádza v balíku java.util a obsahuje 2 metódy Compare(Object obj1,Object obj2) a equals(Object element).

Poskytuje viacero triediacich sekvencií, t.j. prvky môžete triediť na základe ľubovoľného dátového člena, napríklad rollno, meno, vek alebo čokoľvek iné.

Metódy rozhrania Java Comparator Interface

MetódaPopis
public int porovnanie (Object obj1, Object obj2)Porovnáva prvý objekt s druhým objektom.
verejný boolovský rovná sa (objekt objektu)Používa sa na porovnanie aktuálneho objektu so zadaným objektom.
verejný boolovský rovná sa (objekt objektu)Používa sa na porovnanie aktuálneho objektu so zadaným objektom.

Kolekčná trieda

zbierky poskytuje statické metódy na triedenie prvkov kolekcie. Ak sú prvky kolekcie Set alebo Map, môžeme použiť TreeSet alebo TreeMap. Nemôžeme však triediť prvky zoznamu. Trieda Collections tiež poskytuje metódy na triedenie prvkov prvkov typu List.

Metóda triedy Collections na triedenie prvkov zoznamu

public void sort (zoznam zoznam, komparátor c): slúži na zoradenie prvkov Zoznamu podľa daného porovnávača.


Príklad komparátora Java (negenerický starý štýl)

Pozrime sa na príklad triedenia prvkov Zoznamu na základe veku a mena. V tomto príklade sme vytvorili 4 triedy java:

  1. Študent.java
  2. AgeComparator.java
  3. NameComparator.java
  4. Jednoduché.java
Študent.java

Táto trieda obsahuje tri polia rollno, meno a vek a parametrizovaný konštruktor.

 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

Táto trieda definuje logiku porovnávania na základe veku. Ak je vek prvého objektu väčší ako druhý, vraciame kladnú hodnotu. Môže to byť ktokoľvek, napríklad 1, 2, 10. Ak je vek prvého objektu nižší ako vek druhého objektu, vraciame zápornú hodnotu, môže to byť akákoľvek záporná hodnota, a ak je vek oboch objektov rovnaký, vraciame 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; } } 
NameComparator.java

Táto trieda poskytuje logiku porovnávania na základe názvu. V takom prípade používame metódu CompareTo() triedy String, ktorá interne poskytuje porovnávaciu logiku.

 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); } } 
Jednoduché.java

V tejto triede tlačíme hodnoty objektu triedením na základe mena a veku.

 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 

Príklad komparátora Java (všeobecný)

Študent.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; } } 
NameComparator.java

Táto trieda poskytuje logiku porovnávania na základe názvu. V takom prípade používame metódu CompareTo() triedy String, ktorá interne poskytuje porovnávaciu logiku.

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

V tejto triede tlačíme hodnoty objektu triedením na základe mena a veku.

 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 

Rozhranie komparátora Java 8

Rozhranie Java 8 Comparator je funkčné rozhranie, ktoré obsahuje iba jednu abstraktnú metódu. Teraz môžeme použiť rozhranie komparátora ako cieľ priradenia pre výraz lambda alebo odkaz na metódu.

Metódy rozhrania Java 8 Comparator Interface

MetódaPopis
int porovnanie (T o1, T o2)Porovnáva prvý objekt s druhým objektom.
statickéPorovnávanie komparátora (Function keyExtractor)Prijíma funkciu, ktorá extrahuje porovnateľný triediaci kľúč z typu T a vráti komparátor, ktorý porovnáva podľa tohto triediaceho kľúča.
statické porovnávanie komparátora (funkcia keyExtractor, komparátor keyComparator)Prijíma funkciu, ktorá extrahuje triediaci kľúč z typu T a vracia komparátor, ktorý porovnáva podľa tohto triediaceho kľúča pomocou zadaného komparátora.
statický komparátor porovnávanieDouble(ToDoubleFunction keyExtractor)Prijíma funkciu, ktorá extrahuje dvojitý triediaci kľúč z typu T a vracia komparátor, ktorý porovnáva podľa tohto triediaceho kľúča.
statický komparátor comparingInt(ToIntFunction keyExtractor)Prijíma funkciu, ktorá extrahuje triediaci kľúč int z typu T a vracia komparátor, ktorý porovnáva podľa tohto triediaceho kľúča.
statický komparátor comparingLong(ToLongFunction keyExtractor)Prijíma funkciu, ktorá extrahuje dlhý triediaci kľúč z typu T a vracia komparátor, ktorý porovnáva podľa tohto triediaceho kľúča.
boolean rovná sa (objekt objektu)Používa sa na porovnanie aktuálneho objektu so zadaným objektom.
statickéPorovnávač naturalOrder()Vracia komparátor, ktorý porovnáva porovnateľné objekty v prirodzenom poradí.
statický komparátor nullsFirst (porovnávač komparátora)Vracia komparátor, ktorý považuje hodnotu null za menej ako nenulové prvky.
statický komparátor nullsLast(porovnávač komparátora)Vráti komparátor, ktorý považuje hodnotu null za väčšiu ako nenulové prvky.
predvolený komparátor obrátený ()Vráti komparátor, ktorý obsahuje opačné poradie poskytnutého komparátora.
statickéPorovnávač reverseOrder()Vráti komparátor, ktorý obsahuje opačné prirodzené usporiadanie.
predvolený porovnávač potom porovnávanie (porovnávač iné)Vracia lexikograficko-poradový komparátor s iným komparátorom.
predvolenáKomparátor a potom porovnanie (Extractor funkčných kláves)Vracia komparátor lexikografického poradia s funkciou, ktorá extrahuje porovnávací kľúč triedenia.
predvolený komparátor potom porovnanie(funkcia keyExtractor, komparátor keyComparator)Vracia komparátor lexikografického poriadku s funkciou, ktorá extrahuje kľúč na porovnanie s daným komparátorom.
predvolený komparátor thenComparingDouble(ToDoubleFunction keyExtractor)Vracia komparátor lexikografického poradia s funkciou, ktorá extrahuje dvojitý kľúč triedenia.
predvolený komparátor thenComparingInt(ToIntFunction keyExtractor)Vracia komparátor lexikografického poradia s funkciou, ktorá extrahuje kľúč triedenia int.
predvolený komparátor thenComparingLong(ToLongFunction keyExtractor)Vracia komparátor lexikografického poradia s funkciou, ktorá extrahuje dlhý kľúč triedenia.

Príklad komparátora Java 8

Pozrime sa na príklad triedenia prvkov Zoznamu na základe veku a mena.

Súbor: 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; } } 

Súbor: 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 

Java 8 Comparator Príklad: metóda nullsFirst() a nullsLast().

Tu triedime zoznam prvkov, ktorý tiež obsahuje null.

Súbor: 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; } } 

Súbor: 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