comparable comparator interfaces java
W tym samouczku z przykładami wyjaśniono koncepcję interfejsów porównywalnych i porównawczych w języku Java. Dowiesz się również o różnicach między nimi:
Dowiedzieliśmy się wszystkiego o interfejsach z naszych wcześniejszych tutoriali. Interfejs służy do deklarowania metod abstrakcyjnych i zmiennych statycznych lub końcowych. Domyślnie metody interfejsu są publiczne. Od wersji Java 8 interfejsy mogą również mieć zdefiniowane metody statyczne i domyślne.
Java udostępnia różne wbudowane interfejsy, których możemy używać do wykonywania różnych operacji. W tym samouczku omówimy dwa takie interfejsy, tj. Porównywalny i Komparator. Porównywalny interfejs jest używany do sortowania obiektów według naturalnego porządku. Interfejs komparatora służy do sortowania poszczególnych atrybutów różnych obiektów.
=> Zapoznaj się z serią prostych szkoleń dotyczących języka Java.
Zacznijmy od porównywalnego interfejsu.
Czego się nauczysz:
- Porównywalny interfejs w Javie
- Interfejs komparatora w Javie
- Różnica między porównywalnym a komparatorem
- Wniosek
Porównywalny interfejs w Javie
Porównywalny interfejs sortuje struktury list, takie jak Arrays i ArrayLists zawierające niestandardowe obiekty. Gdy obiekty listy zaimplementują interfejs Comparable, możemy następnie użyć metody Collections.sort () lub Arrays.sort () w przypadku tablic do sortowania zawartości.
Ale kiedy mamy własne klasy i musimy posortować ich obiekty, będziemy musieli zaimplementować interfejs Comparable w tej klasie. Interfejs Porównywalny jest częścią java.lang pakiet. Ten interfejs ma tylko jedną metodę, CompareTo (). Korzystając z porównywalnego interfejsu, możemy jednocześnie sortować pojedynczy element danych.
Na przykład, jeśli mamy imię i wiek jako pola w naszej klasie, możemy jednocześnie sortować obiekty klasy według nazwy lub wieku. Nie możemy sortować jednocześnie według nazwiska i wieku.
Jak wyjaśniono powyżej, możemy zaimplementować interfejs Comparable w Javie, mając niestandardową klasę do implementacji interfejsu Comparable. Interfejs Comparable ma tylko jedną metodę „compareTo”, którą należy przesłonić w klasie, aby posortować obiekty niestandardowe.
Metoda „Porównaj z”
Metoda „compareTo” interfejsu Comparable służy do porównania bieżącego obiektu z danym obiektem. Ogólna składnia obiektu compareTo jest podana poniżej.
public int compareTo (Object obj)
Jak pokazano powyżej, metoda compareTo przyjmuje obiekt jako argument (może to być dowolny obiekt niestandardowy) i porównuje go z bieżącym obiektem używanym do wywołania tej metody.
Metoda compareTo zwraca wartość całkowitą, która może mieć jedną z następujących wartości:
- Dodatnia (> 0) liczba całkowita => bieżący obiekt> przekazany parametr obiektu.
- Ujemny (bieżący obiekt
- Zero (= 0) => bieżący obiekt i określony obiekt są równe.
Możemy użyć metody compareTo () do sortowania:
- Obiekty typu String
- Obiekty klasy opakowania
- Obiekty zdefiniowane przez użytkownika lub niestandardowe
Zaimplementujmy teraz przykład porównywalnego interfejsu.
Przykład porównywalnego interfejsu
Poniższy program w języku Java implementuje klasę Person, która zawiera imię i wiek jako pola składowe. Ta klasa implementuje interfejs „Comparable”, który pozwoli nam posortować obiekt klasy Person.
Zwróć uwagę, że ponieważ zamierzamy sortować obiekty niestandardowe, musimy nadpisać metodę „compareTo ()” interfejsu Comparable.
Wewnątrz nadpisanej metody compareTo () porównujemy wiek przekazanego obiektu person z wiekiem bieżącego obiektu i odpowiednio zwracamy wartość.
Przykładowy program w języku Java jest podany poniżej.
//class person implementing Comparable interface class Person implements Comparable { private String name; private int age; //Person constructor public Person(String name, int age) { this.name = name; this.age = age; } //getter methods for Person members public int getAge() { return this.age; } public String getName() { return this.name; } //override toString () method @Override public String toString() { return ''; } //Override compareTo () method to compare age of two Person objects @Override public int compareTo(Person per) { if(this.age == per.age) return 0; else return this.age > per.age ? 1 : -1; } } public class Main{ public static void main(String[] args) { //declare two objects of Person class Person p1 = new Person('Adrian', 24); Person p2 = new Person('Eddie', 26); int ageDiff = p1.compareTo(p2); //compare ages of two persons declared switch(ageDiff) { case -1: { System.out.println(p2.getName() + ' is older than ' + p1.getName()); break; } case 1: { System.out.println(p1.getName() + ' is older than ' + p2.getName()); break; } default: System.out.println(p1.getName () + ' and ' + p2.getName () + ' are of the same age!'); } } }
Wynik:
Jak widać z danych wyjściowych, używamy interfejsu Comparable do porównania dwóch obiektów klasy Person na podstawie zmiennej składowej age.
Jak sugeruje nazwa, interfejs Comparable pozwala nam porównać jeden obiekt z drugim, pod warunkiem, że obiekty są tego samego typu. Dopóki obiekty wiedzą, że same się układają, możemy je łatwo sortować za pomocą jedynej metody „compareTo ()”, która należy do tego interfejsu.
Metoda Java String CompareTo ()
Możemy również użyć metody compareTo () do porównania dwóch obiektów typu String w Javie. Dwa obiekty łańcuchowe są porównywane leksykograficznie poprzez konwersję każdego znaku obiektu ciągu na odpowiadający mu znak Unicode.
Jeśli dwa ciągi są równe, zwracane jest 0. Jeśli pierwszy obiekt jest większy niż drugi obiekt, zwracana jest wartość dodatnia, a wartość ujemna jest zwracana, jeśli pierwszy obiekt ciągu jest mniejszy niż drugi obiekt String.
Na przykład,
string1.compareTo (string2) porówna łańcuch 1 i 2 leksykograficznie.
public class Main { public static void main(String args[]) { //declare and print string objects String str1 = 'SoftwareTestingHelp'; String str2 = 'Java Series tutorial'; String str3 = 'Comparable Interface'; System.out.println('str1:' + str1); System.out.println('str2:' + str2); System.out.println('str3:' + str3); //compare strings and print the results. int retval1 = str1.compareTo( str2 ); System.out.println('
str1 & str2 comparison: '+retval1); int retval2 = str1.compareTo( str3 ); System.out.println('str1 & str3 comparison: '+retval2); int retval3 = str2.compareTo('compareTo method'); System.out.println('str2 & string argument comparison: '+retval3); } }
Wynik:
W powyższym programie widzieliśmy, jak użyć metody compareTo () do porównania dwóch ciągów. Wcześniej używaliśmy metody compareTo () do porównywania wartości całkowitych (na przykład wiek). Podobnie, możemy użyć innych typów danych, takich jak double, z metodą compareTo ().
Przejdźmy teraz do interfejsu komparatora w Javie.
Interfejs komparatora w Javie
Widzieliśmy już działanie interfejsu porównywalnego. Porównywalny interfejs umożliwia nam sortowanie obiektów niestandardowych na podstawie pojedynczego członka danych. Ale gdy pojawia się potrzeba sortowania obiektu na podstawie wielu pól lub elementów danych, możemy wybrać interfejs komparatora.
Korzystając z interfejsu komparatora, możemy utworzyć więcej niż jeden komparator w zależności od tego, ile pól chcemy użyć do sortowania obiektów niestandardowych. Korzystając z interfejsu komparatora, przypuśćmy, że chcemy posortować obiekt niestandardowy według nazwy i wieku dwóch pól składowych, a następnie musimy mieć dwa komparatory, jeden dla nazwy, a drugi dla wieku.
Następnie możemy wywołać metodę Collections.sort () z tymi komparatorami.
Jak więc dokładnie możemy napisać Komparatory?
Rozważmy przykład ucznia klasy z imieniem i wiekiem jako polem. Weź pod uwagę, że chcemy posortować obiekty Studentów według nazw i wieku.
W tym celu będziemy musieli najpierw napisać klasy Comparator, StudentAgeComparator i StudenNameComparator. W tych klasach nadpisujemy metodę compare () interfejsu Comparator, a następnie wywołamy metodę Collections.sort przy użyciu każdego z tych komparatorów do sortowania obiektów uczniów.
Interfejs komparatora zawiera obiekt „porównaj”, który służy do porównywania obiektów dwóch różnych klas. Ogólna składnia metody porównania to:
public int compare (Object obj1, Object obj2);
Metoda porównania porównuje obj1 z obj2.
Interfejs komparatora jest częścią java.util pakiet i oprócz metody porównania; zawiera również inną metodę o nazwie equals.
Przykład komparatora Java
Zaimplementujmy przykład porównawczy w Javie. Ponownie wzięliśmy klasę studenta z imieniem i wiekiem jako składnikami danych. Następnie definiujemy klasę porównawczą AgeComparator, która zastępuje metodę porównania w celu porównania wieku dwóch uczniów i zwrócenia odpowiednich wartości.
W metodzie głównej tworzymy tablicę obiektów Studentów. Następnie wywołujemy metodę Collections.sort z obiektem ArrayList i AgeComparator jako argumentami. To sortuje obiekty Studentów według wieku.
Program Java realizujący ten scenariusz przedstawiono poniżej.
import java.util.*; //class student whose objects are to be sorted 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 class implementing Comparator to compare objects 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; } } class Main{ public static void main(String args[]){ //create an ArrayList of Students ArrayList myList=new ArrayList(); myList.add(new Student(101,'Adrian',25)); myList.add(new Student(106,'Sydney',22)); myList.add(new Student(105,'Marcus',27)); //call Collections.sort method with AgeComparator object to sort ArrayList Collections.sort(myList,new AgeComparator()); System.out.println('Sorted Student objects by Age are as follows:'); Iterator iter= myList.iterator(); while(iter.hasNext()){ Student st=(Student) iter.next(); System.out.println(st.rollno+' '+st.name+' '+st.age); } } }
Wynik:
youtube na mp3 dłużej niż 30 minut
W powyższym programie, podobnie do sposobu, w jaki napisaliśmy AgeComparator do sortowania obiektów Studentów na podstawie Age, możemy również napisać inny NameComparator, aby posortować obiekty Studentów na podstawie pola nazwy.
W ten sposób możemy mieć tyle klas komparatora, ile potrzeba do sortowania obiektów w różnych polach. Sposób, w jaki porównaliśmy dwie zmienne int, możemy również porównać zmienne innych typów danych za pomocą metody Compare.
Różnica między porównywalnym a komparatorem
Porównywalny interfejs | Interfejs komparatora |
---|---|
Używa Collections.sort (List) do sortowania elementów. | Używa Collections.sort (List, Comparator) do sortowania elementów. |
Porównywalny interfejs zapewnia sortowanie według pojedynczego pola. | Interfejs komparatora zapewnia sortowanie wielu pól. |
Porównywalny interfejs sortuje obiekt według naturalnego porządku. | Interfejs komparatora sortuje różne atrybuty różnych obiektów. |
Używając porównywalnego interfejsu, możemy porównać bieżący obiekt „this” z określonym obiektem. | Korzystając z interfejsu komparatora, możemy porównać obiekty różnych klas. |
Część pakietu java.lang. | Część pakietu java.util. |
Użycie porównywalnego interfejsu modyfikuje aktualną klasę. | Komparator nie zmienia oryginalnej klasy. |
Udostępnia metodę compareTo () do sortowania elementów. | Udostępnia metodę compare () do sortowania elementów. |
Często Zadawane Pytania
P # 1) Czy można porównać funkcjonalny interfejs?
Odpowiedź: Tak, porównywalny to funkcjonalny interfejs. Deklaruje pojedynczą metodę abstrakcyjną, compareTo ().
P # 2) Jak sprawić, by klasa była porównywalna?
Odpowiedź: Sprawiamy, że klasa jest porównywalna, implementując interfejs Comparable. Wewnątrz klasy przesłaniamy metodę compareTo (), aby posortować obiekt. Przekazujemy obiekt i porównujemy go z bieżącym obiektem.
Metoda compareTo () zwraca 0, jeśli dwa obiekty są równe. Zwraca liczbę ujemną, jeśli pierwszy obiekt jest mniejszy niż drugi i dodatnią, jeśli pierwszy obiekt jest większy niż drugi obiekt.
P # 3) Jaki jest główny cel interfejsu Komparatora?
Odpowiedź: Interfejs komparatora jest używany głównie do sortowania obiektów niestandardowych. Interfejs komparatora może być również używany do porównywania obiektów różnych klas. Ponadto interfejsu komparatora można używać do sortowania obiektów w wielu polach.
P # 4) Dlaczego komparator jest używany w Javie?
Odpowiedź: Interfejs komparatora jest używany głównie wtedy, gdy chcemy mieć inną kolejność sortowania dla naszych niestandardowych obiektów niż kolejność naturalna oparta na wielu polach.
P # 5) Co implementuje interfejs Comparable?
Odpowiedź: Porównywalny interfejs jest implementowany przez wszystkie klasy opakowania i klasę String. Obiekty niestandardowe również używają porównywalnego interfejsu do sortowania.
Wniosek
W tym samouczku omówiliśmy interfejsy porównywalne i porównawcze w Javie. Porównywalny interfejs służy do sortowania obiektów zgodnie z naturalną kolejnością i jednocześnie może sortować obiekty tylko na jednym polu.
Porównywalny interfejs ma metodę „compareTo ()”, którą należy przesłonić w klasie implementującej interfejs Comparator i której obiekty mają być sortowane.
Interfejs komparatora służy do sortowania obiektów niestandardowych, które mają być sortowane w dowolnej innej kolejności. Interfejs komparatora pozwala nam również sortować obiekty dwóch różnych klas na podstawie wielu pól.
=> Przeczytaj serię szkoleń Easy Java.
rekomendowane lektury
- Interfejs Java i samouczek klasy abstrakcyjnej z przykładami
- Ustaw interfejs w języku Java: samouczek dotyczący zestawu Java z przykładami
- Wdrażanie Java: tworzenie i wykonywanie pliku Java JAR
- Podstawy języka Java: składnia języka Java, klasa języka Java i podstawowe pojęcia dotyczące języka Java
- Wirtualna maszyna Java: jak JVM pomaga w uruchamianiu aplikacji Java
- Interfejs ListIterator w Javie z przykładami
- Tablica obiektów w Javie: jak tworzyć, inicjować i używać
- Samouczek JAVA dla początkujących: ponad 100 praktycznych samouczków wideo Java