comparable comparator interfaces java
Tento výukový program vysvětluje na příkladech koncept srovnatelných a komparačních rozhraní v Javě. Dozvíte se také o rozdílech mezi těmito dvěma:
Vše o rozhraních jsme se dozvěděli v našich dřívějších výukách. Rozhraní se používá k deklaraci abstraktních metod a statických nebo konečných proměnných. Ve výchozím nastavení jsou metody rozhraní veřejné. Od verze Java 8 mohou mít rozhraní také definované statické a výchozí metody.
Java poskytuje různá integrovaná rozhraní, která můžeme použít k provádění různých operací. V tomto tutoriálu probereme dvě taková rozhraní, tj. Srovnatelné a Srovnávač. Pro třídění objektů podle přirozeného uspořádání se používá srovnatelné rozhraní. Rozhraní komparátoru se používá k třídění jednotlivých atributů různých objektů.
=> Prozkoumejte jednoduchou sérii školení Java zde.
Začněme srovnatelným rozhraním.
Co se naučíte:
- Srovnatelné rozhraní v Javě
- Porovnávací rozhraní v Javě
- Rozdíl mezi srovnatelným Vs komparátorem
- Závěr
Srovnatelné rozhraní v Javě
Srovnatelné rozhraní třídí struktury seznamu jako Arrays a ArrayLists obsahující vlastní objekty. Jakmile objekty seznamu implementují srovnatelné rozhraní, můžeme k seřazení obsahu použít metodu Collections.sort () nebo Arrays.sort () v případě polí.
Ale když máme vlastní třídy a potřebujeme třídit jejich objekty, pak budeme muset implementovat srovnatelné rozhraní v této třídě. Srovnatelné rozhraní je součástí java.lang balík. Toto rozhraní má pouze jednu metodu, CompareTo (). Pomocí srovnatelného rozhraní můžeme řadit jeden datový člen najednou.
Například, máme-li jako pole v naší třídě jméno a věk, můžeme najednou třídit objekty třídy podle jména nebo věku. Nemůžeme třídit současně podle jména i věku.
Jak je vysvětleno výše, můžeme implementovat srovnatelné rozhraní v Javě tím, že budeme mít vlastní třídu k implementaci srovnatelného rozhraní. Srovnatelné rozhraní má pouze jednu metodu „compareTo“, kterou je třeba ve třídě přepsat, aby se seřadily vlastní objekty.
Metoda „CompareTo“
K porovnání aktuálního objektu s daným objektem se používá metoda „compareTo“ srovnatelného rozhraní. Obecná syntaxe objektu compareTo je uvedena níže.
public int compareTo (Object obj)
Jak je uvedeno výše, metoda compareTo přijímá objekt jako argument (může to být jakýkoli vlastní objekt) a porovnává ho s aktuálním objektem použitým k vyvolání této metody.
Metoda compareTo vrací celočíselnou hodnotu, která může mít jednu z následujících hodnot:
- Kladné (> 0) celé číslo => aktuální objekt> předaný parametr objektu.
- Negativní (aktuální objekt
- Nula (= 0) => aktuální objekt i zadaný objekt jsou stejné.
K třídění můžeme použít metodu compareTo ():
- Objekty typu řetězec
- Objekty třídy obálky
- Uživatelem definované nebo vlastní objekty
Nyní provedeme příklad srovnatelného rozhraní.
Příklad srovnatelného rozhraní
Následující program Java implementuje třídu Person, která obsahuje jméno a věk jako pole člena. Tato třída implementuje „srovnatelné“ rozhraní, které nám umožní třídit objekt třídy Osoba.
Všimněte si, že když budeme třídit vlastní objekty, musíme přepsat metodu „compareTo ()“ srovnatelného rozhraní.
výchozí brána není neustále k dispozici
Uvnitř přepsané metody compareTo () porovnáme věk osobního objektu, který je předán, s věkem aktuálního objektu a podle toho vrátíme hodnotu.
Níže je uveden příklad Java programu.
//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!'); } } }
Výstup:
Jak je patrné z výstupu, použijeme srovnatelné rozhraní k porovnání dvou objektů třídy Person na základě věkové členské proměnné.
Jak název napovídá, srovnatelné rozhraní nám umožňuje porovnat jeden objekt s druhým za předpokladu, že jsou objekty stejného typu. Dokud objekty vědí, že se samy umí uspořádat, můžeme je snadno třídit pomocí jediné metody ‚compareTo () ', která patří k tomuto rozhraní.
Metoda Java String CompareTo ()
Můžeme také použít metodu compareTo () k porovnání dvou objektů typu String v Javě. Dva řetězcové objekty jsou porovnány lexikograficky převedením každého znaku řetězcového objektu na jeho ekvivalentní znak Unicode.
Pokud jsou dva řetězce stejné, vrátí se 0. Pokud je první objekt větší než druhý objekt, pak je vrácena kladná hodnota a záporná hodnota, pokud je první objekt řetězce menší než druhý objekt String.
Například,
string1.compareTo (string2) porovná lexikograficky řetězec1 a řetězec 2.
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); } }
Výstup:
Ve výše uvedeném programu jsme viděli, jak použít metodu compareTo () k porovnání dvou řetězců. Před tím jsme použili metodu compareTo () k porovnání celočíselných hodnot (například věk). Podobně můžeme použít jiné datové typy, jako jsou doubles, s metodou compareTo ().
Nyní přejdeme k rozhraní komparátoru v Javě.
Porovnávací rozhraní v Javě
Již jsme viděli fungování srovnatelného rozhraní. Srovnatelné rozhraní nám umožňuje třídit vlastní objekty na základě jednoho datového člena. Když ale vznikne požadavek na třídění objektu na základě více polí nebo datových členů, můžeme se rozhodnout pro rozhraní komparátoru.
Pomocí rozhraní komparátoru můžeme vytvořit více než jeden komparátor v závislosti na tom, kolik polí chceme použít k seřazení vlastních objektů. Pokud použijeme rozhraní komparátoru, předpokládejme, že chceme třídit vlastní objekt na dvě jména a věk členských polí, pak musíme mít dva komparátory, jeden pro jméno a druhý pro věk.
Pak můžeme pomocí těchto komparátorů zavolat metodu Collections.sort ().
Jak přesně tedy můžeme psát komparátory?
Zvažte příklad studenta třídy s polem jménem a věkem. Zvažte, že chceme třídit Studentské objekty v polích pro jméno a věk.
Z tohoto důvodu budeme muset nejprve napsat třídy Comparator, StudentAgeComparator a StudenNameComparator. V těchto třídách přepíšeme metodu porovnání () rozhraní komparátoru a potom zavoláme metodu Collections.sort pomocí každého z těchto komparátorů k seřazení studentských objektů.
Rozhraní komparátoru obsahuje objekt „porovnání“, který se používá k porovnání objektů dvou různých tříd. Obecná syntaxe metody porovnání je:
public int compare (Object obj1, Object obj2);
Metoda porovnání porovnává obj1 s obj2.
Rozhraní komparátoru je součástí java.util balíček a kromě metody porovnání; obsahuje také další metodu s názvem equals.
Příklad srovnávače Java
Pojďme implementovat příklad komparátoru v Javě. Opět jsme vzali třídu Student se jménem a věkem jako její datové členy. Poté definujeme třídu komparátoru AgeComparator, která přepíše metodu porovnání k porovnání stáří dvou studentů a vrácení příslušných hodnot.
V hlavní metodě konstruujeme Arraylist Studentových objektů. Pak voláme metodu Collections.sort s objektem ArrayList a AgeComparator jako argumenty. Tím se třídí objekty Student podle věku.
Program Java implementující tento scénář je uveden níže.
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); } } }
Výstup:
Ve výše uvedeném programu, podobným způsobem, jakým jsme napsali AgeComparator pro třídění Studentských objektů na základě Age, můžeme také napsat jiný NameComparator pro třídění Studentských objektů na základě pole názvu.
Tímto způsobem můžeme mít tolik tříd komparátoru, kolik je potřeba k třídění objektů v různých polích. Způsob, jakým jsme porovnávali dvě int proměnné, můžeme také porovnávat proměnné ostatních datových typů pomocí metody Compare.
Rozdíl mezi srovnatelným Vs komparátorem
Srovnatelné rozhraní | Rozhraní komparátoru |
---|---|
K třídění prvků používá Collections.sort (List). | K třídění prvků používá Collections.sort (List, Comparator). |
Srovnatelné rozhraní poskytuje třídění jednoho pole. | Rozhraní komparátoru poskytuje třídění více polí. |
Srovnatelné rozhraní třídí objekty podle přirozeného řazení. | Rozhraní komparátoru třídí různé atributy různých objektů. |
Pomocí srovnatelného rozhraní můžeme porovnat aktuální objekt „this“ se zadaným objektem. | Pomocí rozhraní komparátoru můžeme porovnávat objekty různých tříd. |
Část balíčku java.lang. | Část balíčku java.util. |
Použití srovnatelného rozhraní upravuje skutečnou třídu. | Komparátor nemění původní třídu. |
Poskytuje metodu compareTo () pro třídění prvků. | Poskytuje metodu porovnání () pro třídění prvků. |
Často kladené otázky
Otázka č. 1) Je srovnatelné funkční rozhraní?
Odpovědět: Ano, srovnatelné je funkční rozhraní. Deklaruje jedinou abstraktní metodu, compareTo ().
Otázka č. 2) Jak dosáhnete srovnatelné třídy?
Odpovědět: Vytvoříme třídu srovnatelnou implementací srovnatelného rozhraní. Uvnitř třídy přepíšeme metodu compareTo (), abychom objekt seřadili. Předáme objekt a porovnáme ho s aktuálním objektem.
Metoda compareTo () vrací 0, pokud jsou dva objekty stejné. Vrací záporné číslo, pokud je první objekt menší než druhý a kladné, pokud je první objekt větší než druhý objekt.
Otázka č. 3) Jaký je hlavní účel rozhraní komparátoru?
Odpovědět: Rozhraní komparátoru se používá hlavně k třídění vlastních objektů. Porovnávací rozhraní lze také použít k porovnání objektů různých tříd. Rozhraní komparátoru lze také použít k třídění objektů ve více polích.
Otázka č. 4) Proč se v Javě používá komparátor?
Odpovědět: Rozhraní komparátoru se používá hlavně, když chceme pro naše vlastní objekty jiné pořadí řazení než přirozené řazení založené na více polích.
Otázka č. 5) Co implementuje srovnatelné rozhraní?
Odpovědět: Srovnatelné rozhraní je implementováno všemi obalovými třídami a třídou String. Vlastní objekty také používají pro třídění srovnatelné rozhraní.
Závěr
V tomto kurzu jsme diskutovali o srovnatelných a srovnávacích rozhraních v Javě. Srovnatelné rozhraní se používá k třídění objektů podle přirozeného řazení a najednou může třídit objekty pouze na jednom poli.
Srovnatelné rozhraní má metodu ‚compareTo () ', kterou je třeba přepsat ve třídě implementující rozhraní komparátoru a jejíž objekty mají být tříděny.
Rozhraní komparátoru se používá k třídění vlastních objektů, které mají být tříděny na základě jakéhokoli jiného pořadí. Rozhraní komparátoru nám také umožňuje třídit objekty dvou různých tříd na základě více polí.
=> Přečtěte si řadu Easy Java Training Series.
Doporučené čtení
- Výukový program pro rozhraní Java a abstrakt třídy s příklady
- Set Interface In Java: Java Set Tutorial With examples
- Implementace Java: Vytvoření a spuštění souboru Java JAR
- Základy jazyka Java: Syntaxe jazyka Java, třída Java a základní koncepty Java
- Virtuální stroj Java: Jak JVM pomáhá při spouštění aplikace Java
- Rozhraní ListIterator v Javě s příklady
- Pole objektů v Javě: Jak vytvářet, inicializovat a používat
- Výukový program JAVA pro začátečníky: 100+ praktických výukových programů Java Video