logo

Interfejs komparatora Java

Interfejs komparatora Java służy do porządkowania obiektów klasy zdefiniowanej przez użytkownika.

Interfejs ten znajduje się w pakiecie java.util i zawiera 2 metody Compare(Object obj1,Object obj2) i Equals(Element obiektu).

Zapewnia wiele sekwencji sortowania, tzn. możesz sortować elementy na podstawie dowolnego elementu danych, na przykład rollno, imienia, wieku lub czegokolwiek innego.

Metody interfejsu komparatora Java

metodaOpis
public int Compare(Obiekt obj1, Obiekt obj2)Porównuje pierwszy obiekt z drugim obiektem.
publiczna wartość logiczna równa się (obiekt obiektu)Służy do porównania bieżącego obiektu z określonym obiektem.
publiczna wartość logiczna równa się (obiekt obiektu)Służy do porównania bieżącego obiektu z określonym obiektem.

Klasa Kolekcje

Kolekcje class udostępnia statyczne metody sortowania elementów kolekcji. Jeśli elementy kolekcji są typu Set lub Map, możemy użyć TreeSet lub TreeMap. Nie możemy jednak sortować elementów Listy. Klasa Collections udostępnia także metody sortowania elementów typu List.

Metoda klasy Collections służąca do sortowania elementów listy

public void sort(lista list, komparator c): służy do sortowania elementów Listy według danego Komparatora.


Przykład komparatora Java (nieogólny stary styl)

Zobaczmy przykład sortowania elementów Listy na podstawie wieku i imienia. W tym przykładzie utworzyliśmy 4 klasy Java:

  1. Student.java
  2. AgeComparator.java
  3. NazwaKomparator.java
  4. Simple.java
Student.java

Klasa ta zawiera trzy pola rollno, name i age oraz sparametryzowany 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

Ta klasa definiuje logikę porównania w oparciu o wiek. Jeśli wiek pierwszego obiektu jest większy niż drugiego, zwracamy wartość dodatnią. Może to być dowolna liczba np. 1, 2, 10. Jeśli wiek pierwszego obiektu jest mniejszy niż drugiego obiektu, zwracamy wartość ujemną, może to być dowolna wartość ujemna, a jeśli wiek obu obiektów jest równy, wracamy 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; } } 
NazwaKomparator.java

Ta klasa zapewnia logikę porównawczą opartą na nazwie. W takim przypadku korzystamy z metody CompareTo() klasy String, która wewnętrznie udostępnia logikę porównania.

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

W tej klasie drukujemy wartości obiektu sortując po nazwie i wieku.

 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 

Przykład komparatora Java (ogólny)

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

Ta klasa zapewnia logikę porównawczą opartą na nazwie. W takim przypadku korzystamy z metody CompareTo() klasy String, która wewnętrznie udostępnia logikę porównania.

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

W tej klasie drukujemy wartości obiektu sortując po nazwie i wieku.

 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 

Interfejs komparatora Java 8

Interfejs Java 8 Comparator to interfejs funkcjonalny, który zawiera tylko jedną metodę abstrakcyjną. Teraz możemy użyć interfejsu Comparator jako celu przypisania dla wyrażenia lambda lub odwołania do metody.

Metody interfejsu komparatora Java 8

metodaOpis
int porównaj(T o1, To o2)Porównuje pierwszy obiekt z drugim obiektem.
statycznyPorównanie komparatora (ekstraktor klawiszy funkcyjnych)Akceptuje funkcję, która wyodrębnia klucz sortowania Comparable z typu T i zwraca komparator, który porównuje według tego klucza sortowania.
statyczne porównywanie komparatorów (ekstraktor klawiszy funkcyjnych, komparator kluczy komparatorów)Akceptuje funkcję, która wyodrębnia klucz sortowania z typu T i zwraca komparator, który porównuje według tego klucza sortowania przy użyciu określonego komparatora.
statyczny komparator porównującyDouble(ToDoubleFunction keyExtractor)Akceptuje funkcję, która wyodrębnia klucz podwójnego sortowania z typu T i zwraca komparator, który porównuje według tego klucza sortowania.
statyczny komparator porównującyInt(ToIntFunction keyExtractor)Akceptuje funkcję, która wyodrębnia klucz sortowania typu int z typu T i zwraca komparator, który porównuje według tego klucza sortowania.
statyczny komparator porównującyLong(ToLongFunction keyExtractor)Akceptuje funkcję, która wyodrębnia długi klucz sortowania z typu T i zwraca komparator, który porównuje według tego klucza sortowania.
wartość logiczna równa się (obiekt obiektu)Służy do porównania bieżącego obiektu z określonym obiektem.
statycznyKomparator naturalnyOrder()Zwraca komparator, który porównuje obiekty Comparable w naturalnej kolejności.
static Comparator nullsFirst(Komparator komparatora)Zwraca komparator, który traktuje wartość null jako mniejszą niż elementy inne niż null.
statyczny Komparator nullsLast(Komparator komparatora)Zwraca komparator, który traktuje wartość null jako większą niż elementy inne niż null.
domyślny komparator odwrócony()Zwraca komparator, który zawiera odwrotną kolejność dostarczonego komparatora.
statycznyKomparator ReverseOrder()Zwraca komparator zawierający odwrotność kolejności naturalnej.
domyślny komparator następniePorównanie (inny komparator)Zwraca komparator porządku leksykograficznego z innym komparatorem.
domyślnyKomparator następniePorównanie (Ekstraktor klawiszy funkcyjnych)Zwraca komparator porządku leksykograficznego z funkcją wyodrębniającą klucz sortowania Comparable.
domyślny komparator thenComparing(Ekstraktor klawiszy funkcyjnych, Komparator kluczy komparatorów)Zwraca komparator porządku leksykograficznego z funkcją wyodrębniającą klucz do porównania z danym komparatorem.
domyślny komparator thenComparingDouble(ToDoubleFunction keyExtractor)Zwraca komparator porządku leksykograficznego z funkcją wyodrębniającą klucz podwójnego sortowania.
domyślny komparator thenComparingInt(ToIntFunction keyExtractor)Zwraca komparator porządku leksykograficznego z funkcją wyodrębniającą klucz sortowania typu int.
domyślny komparator thenComparingLong(ToLongFunction keyExtractor)Zwraca komparator porządku leksykograficznego z funkcją wyodrębniającą długi klucz sortowania.

Przykład porównawczy Java 8

Zobaczmy przykład sortowania elementów Listy na podstawie wieku i imienia.

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

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

Przykład komparatora Java 8: metody nullsFirst() i nullsLast().

Tutaj sortujemy listę elementów, która również zawiera wartość null.

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

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