logo

Rozhraní Java Comparator

Rozhraní Java Comparator se používá k řazení objektů uživatelem definované třídy.

Toto rozhraní se nachází v balíčku java.util a obsahuje 2 metody Compare(Object obj1,Object obj2) a equals(Object element).

Poskytuje více třídicích sekvencí, tj. můžete třídit prvky na základě libovolného datového členu, například rollno, jméno, věk nebo cokoli jiného.

Metody rozhraní Java Comparator

MetodaPopis
public int porovnat (Object obj1, Object obj2)Porovnává první objekt s druhým objektem.
public boolean rovná se (Object obj)Slouží k porovnání aktuálního objektu se zadaným objektem.
public boolean rovná se (Object obj)Slouží k porovnání aktuálního objektu se zadaným objektem.

Třída sbírky

Sbírky třída poskytuje statické metody pro řazení prvků kolekce. Pokud jsou prvky kolekce Set nebo Map, můžeme použít TreeSet nebo TreeMap. Nemůžeme však seřadit prvky seznamu. Třída Collections také poskytuje metody pro řazení prvků prvků typu List.

Metoda třídy Collections pro řazení prvků seznamu

public void sort (seznam seznamu, komparátor c): slouží k řazení prvků Seznamu podle daného komparátoru.


Příklad komparátoru Java (negenerický starý styl)

Podívejme se na příklad řazení prvků Seznamu na základě věku a jména. V tomto příkladu jsme vytvořili 4 třídy Java:

  1. Student.java
  2. AgeComparator.java
  3. NameComparator.java
  4. Jednoduché.java
Student.java

Tato třída obsahuje tři pole rollno, jméno a stáří a parametrizovaný 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

Tato třída definuje srovnávací logiku na základě věku. Pokud je stáří prvního objektu větší než druhého, vracíme kladnou hodnotu. Může to být kdokoli, například 1, 2, 10. Pokud je stáří prvního objektu menší než druhého objektu, vracíme zápornou hodnotu, může to být jakákoli záporná hodnota, a pokud je stáří obou objektů stejné, vracíme 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

Tato třída poskytuje logiku porovnání založenou na názvu. V takovém případě používáme metodu CompareTo() třídy String, která interně poskytuje logiku porovnání.

 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 této třídě tiskneme hodnoty objektu řazením na základě jména a věku.

 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 

Příklad komparátoru Java (obecný)

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

Tato třída poskytuje logiku porovnání založenou na názvu. V takovém případě používáme metodu CompareTo() třídy String, která interně poskytuje logiku porovnání.

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

V této třídě tiskneme hodnoty objektu řazením na základě jména a věku.

 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 

Rozhraní komparátoru Java 8

Rozhraní Java 8 Comparator je funkční rozhraní, které obsahuje pouze jednu abstraktní metodu. Nyní můžeme použít rozhraní komparátoru jako cíl přiřazení pro výraz lambda nebo odkaz na metodu.

Metody rozhraní Java 8 Comparator Interface

MetodaPopis
int srovnání (T o1, T o2)Porovnává první objekt s druhým objektem.
statickýPorovnání komparátoru (Function keyExtractor)Přijímá funkci, která extrahuje srovnatelný třídicí klíč z typu T a vrací komparátor, který porovnává podle tohoto třídícího klíče.
statické porovnávání komparátoru (Function keyExtractor, Comparator keyComparator)Přijímá funkci, která extrahuje třídicí klíč z typu T a vrací komparátor, který porovnává podle tohoto třídícího klíče pomocí zadaného komparátoru.
statický komparátor comparingDouble (ToDoubleFunction keyExtractor)Přijímá funkci, která extrahuje dvojitý třídicí klíč z typu T a vrací komparátor, který porovnává podle tohoto třídícího klíče.
statický komparátor comparingInt(ToIntFunction keyExtractor)Přijímá funkci, která extrahuje klíč řazení int z typu T a vrací komparátor, který porovnává podle tohoto klíče řazení.
statický komparátor comparingLong(ToLongFunction keyExtractor)Přijímá funkci, která extrahuje dlouhý klíč řazení z typu T a vrací komparátor, který porovnává podle tohoto klíče řazení.
boolean rovná se (objekt objektu)Slouží k porovnání aktuálního objektu se zadaným objektem.
statickýKomparátor naturalOrder()Vrací komparátor, který porovnává srovnatelné objekty v přirozeném pořadí.
statický komparátor nullsFirst (komparátor komparátor)Vrací komparátor, který považuje hodnotu null za méně než nenulové prvky.
statický komparátor nullsLast(komparátor komparátor)Vrací komparátor, který považuje hodnotu null za větší než prvky bez hodnoty null.
výchozí komparátor reversed()Vrací komparátor, který obsahuje opačné pořadí poskytnutého komparátoru.
statickýKomparátor reverseOrder()Vrací komparátor, který obsahuje opak přirozeného uspořádání.
výchozí komparátor thenComparing(porovnávač jiné)Vrací komparátor lexikografického řádu s jiným komparátorem.
výchozíComparator thenComparing (Function keyExtractor)Vrací komparátor lexikografického pořadí s funkcí, která extrahuje srovnatelný třídicí klíč.
výchozí komparátor thenComparing(funkce keyExtractor, komparátor keyComparator)Vrací komparátor lexikografického řádu s funkcí, která extrahuje klíč, který má být porovnán s daným komparátorem.
výchozí komparátor thenComparingDouble(ToDoubleFunction keyExtractor)Vrací komparátor lexikografického pořadí s funkcí, která extrahuje dvojitý klíč řazení.
výchozí komparátor thenComparingInt(ToIntFunction keyExtractor)Vrací komparátor lexikografického pořadí s funkcí, která extrahuje klíč řazení int.
výchozí komparátor thenComparingLong(ToLongFunction keyExtractor)Vrací komparátor lexikografického pořadí s funkcí, která extrahuje dlouhý klíč řazení.

Příklad komparátoru Java 8

Podívejme se na příklad řazení prvků Seznamu na základě věku a jména.

Soubor: 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; } } 

Soubor: 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 Příklad: metoda nullsFirst() a nullsLast().

Zde seřadíme seznam prvků, který také obsahuje null.

Soubor: 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; } } 

Soubor: 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