comparable comparator interfaces java
Tento výukový program vysvetľuje príklady porovnateľných a komparačných rozhraní v Jave. Dozviete sa tiež o rozdieloch medzi nimi:
Všetko o rozhraniach sme sa dozvedeli v našich predchádzajúcich tutoriáloch. Rozhranie sa používa na deklaráciu abstraktných metód a statických alebo konečných premenných. Predvolene sú metódy rozhrania verejné. Od verzie Java 8 môžu mať rozhrania tiež definované statické a predvolené metódy.
Java poskytuje rôzne vstavané rozhrania, ktoré môžeme použiť na vykonávanie rôznych operácií. V tomto výučbe sa budeme venovať dvom takýmto rozhraniam, t. Na triedenie objektov podľa prirodzeného usporiadania sa používa porovnateľné rozhranie. Rozhranie komparátora slúži na triedenie jednotlivých atribútov rôznych objektov.
=> Preskúmajte tu jednoduchú sériu školení Java.
Začnime porovnateľným rozhraním.
Čo sa dozviete:
- Porovnateľné rozhranie v Jave
- Porovnávacie rozhranie v Jave
- Rozdiel medzi porovnateľným Vs komparátorom
- Záver
Porovnateľné rozhranie v Jave
Porovnateľné rozhranie triedi štruktúry zoznamu ako Arrays a ArrayLists obsahujúce vlastné objekty. Keď objekty v zozname implementujú porovnateľné rozhranie, môžeme na triedenie obsahu použiť metódu Collections.sort () alebo Arrays.sort () v prípade polí.
Ale keď máme vlastné triedy a potrebujeme zoradiť ich objekty, budeme musieť do tejto triedy implementovať porovnateľné rozhranie. Porovnateľné rozhranie je súčasťou java.lang balíček. Toto rozhranie má iba jednu metódu, CompareTo (). Pomocou porovnateľného rozhrania môžeme triediť jeden dátový člen súčasne.
Napríklad, ak máme v našej triede ako polia meno a vek, môžeme naraz triediť objekty triedy podľa mena alebo veku. Nemôžeme triediť súčasne podľa mena aj veku.
Ako už bolo vysvetlené vyššie, porovnateľné rozhranie môžeme implementovať v prostredí Java tým, že budeme mať vlastnú triedu na implementáciu porovnateľného rozhrania. Porovnateľné rozhranie má iba jednu metódu „compareTo“, ktorá musí byť v triede prepísaná, aby sa dali triediť vlastné objekty.
Metóda „CompareTo“
Na porovnanie aktuálneho objektu s daným objektom sa používa metóda „compareTo“ porovnateľného rozhrania. Všeobecná syntax objektu compareTo je uvedená nižšie.
public int compareTo (Object obj)
Ako je uvedené vyššie, metóda compareTo prijíma objekt ako argument (môže to byť akýkoľvek vlastný objekt) a porovnáva ho s aktuálnym objektom použitým na vyvolanie tejto metódy.
Metóda compareTo vráti celočíselnú hodnotu, ktorá môže mať jednu z nasledujúcich hodnôt:
- Kladné (> 0) celé číslo => aktuálny objekt> odovzdaný parameter objektu.
- Záporné (aktuálny objekt
- Nula (= 0) => aktuálny objekt aj zadaný objekt sú rovnaké.
Na triedenie môžeme použiť metódu compareTo ():
- Objekty reťazcového typu
- Objekty triedy wrapper
- Užívateľom definované alebo vlastné objekty
Teraz si ukážeme príklad porovnateľného rozhrania.
Príklad porovnateľného rozhrania
Nasledujúci program Java implementuje triedu Person, ktorá obsahuje meno a vek ako polia člena. Táto trieda implementuje „porovnateľné“ rozhranie, ktoré nám umožní triediť objekt triedy Person.
Upozorňujeme, že keď ideme triediť vlastné objekty, musíme prepísať metódu „compareTo ()“ porovnateľného rozhrania.
typy metadát v dátovom sklade
Vo vnútri prepísanej metódy compareTo () porovnáme vek odovzdaného objektu osoby s vekom aktuálneho objektu a podľa toho vrátime hodnotu.
Nižšie je uvedený príklad programu Java.
//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ýkon:
Ako je zrejmé z výstupu, na porovnanie dvoch objektov triedy Person na základe vekovej členskej premennej používame porovnateľné rozhranie.
Ako už názov napovedá, porovnateľné rozhranie nám umožňuje porovnávať jeden objekt s druhým za predpokladu, že sú rovnakého typu. Pokiaľ objekty vedia svoje usporiadanie, môžeme ich ľahko triediť pomocou jedinej metódy ‘compareTo ()‘, ktorá patrí do tohto rozhrania.
Metóda Java String CompareTo ()
Môžeme tiež použiť metódu compareTo () na porovnanie dvoch objektov typu String v Jave. Dva reťazcové objekty sa lexikograficky porovnávajú tak, že sa každý znak reťazcového objektu prevedie na ekvivalentný znak Unicode.
Ak sú dva reťazce rovnaké, potom sa vráti 0. Ak je prvý objekt väčší ako druhý objekt, potom sa vráti kladná hodnota a záporná hodnota, ak je prvý objekt reťazca menší ako druhý objekt String.
Napríklad,
string1.compareTo (string2) porovná lexikograficky reťazce 1 a 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ýkon:
Vo vyššie uvedenom programe sme videli, ako použiť metódu compareTo () na porovnanie dvoch reťazcov. Predtým sme použili metódu compareTo () na porovnanie celočíselných hodnôt (napríklad vek). Podobne môžeme použiť aj iné dátové typy, ako sú napríklad štvorhry, s metódou compareTo ().
Prejdime teraz k rozhraniu komparátora v Jave.
Porovnávacie rozhranie v Jave
Už sme videli fungovanie porovnateľného rozhrania. Porovnateľné rozhranie nám umožňuje triediť vlastné objekty na základe jedného údajového člena. Ale keď vznikne požiadavka na triedenie objektu na základe viacerých polí alebo dátových členov, môžeme sa rozhodnúť pre rozhranie komparátora.
Pomocou rozhrania komparátora môžeme vytvoriť viac ako jeden komparátor podľa toho, koľko polí chceme použiť na zoradenie vlastných objektov. Ak použijeme rozhranie komparátora, predpokladajme, že chceme zoradiť vlastný objekt na dve členské polia meno a vek, potom musíme mať dva komparátory, jeden pre meno a jeden pre vek.
Potom môžeme pomocou týchto komparátorov zavolať metódu Collections.sort ().
Ako konkrétne teda môžeme napísať komparátory?
Zvážte príklad triedneho študenta, ktorého poľom je meno a vek. Zvážte, že chceme zoradiť študentské objekty podľa mien a vekových polí.
Na tento účel budeme musieť najskôr napísať triedy Comparator, StudentAgeComparator a StudenNameComparator. V týchto triedach prepíšeme metódu compare () rozhrania Comparator a potom zavoláme metódu Collections.sort pomocou každého z týchto komparátorov na triedenie študentských objektov.
Rozhranie komparátora obsahuje objekt „porovnania“, ktorý sa používa na porovnanie objektov dvoch rôznych tried. Všeobecná syntax metódy porovnania je:
public int porovnaj (Objekt obj1, Objekt obj2);
Metóda porovnania porovnáva obj1 s obj2.
Rozhranie komparátora je súčasťou java.util balíka a okrem porovnávacej metódy; obsahuje tiež ďalšiu metódu s názvom equals.
Príklad Java Comparator
Implementujme príklad komparátora v Jave. Opäť sme zobrali triedu študentov s menom a vekom ako jej dátových členov. Potom definujeme komparátorovú triedu AgeComparator, ktorá prepíše porovnávaciu metódu na porovnanie veku dvoch študentov a návrat vhodných hodnôt.
V hlavnej metóde zostrojíme Arraylist of Student objects. Potom voláme metódu Collections.sort s objektom ArrayList a AgeComparator ako argumentmi. Týmto spôsobom zoradíte študentské objekty podľa veku.
Program Java implementujúci tento scenár je uvedený nižšie.
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ýkon:
Vo vyššie uvedenom programe, podobne ako sme napísali AgeComparator na triedenie Študentských objektov podľa veku, môžeme napísať aj ďalší NameComparator na triedenie Študentských objektov na základe poľa názvu.
Takto môžeme mať toľko tried porovnávača, koľko je potrebných na triedenie objektov v rôznych poliach. Akým spôsobom sme porovnávali dve int premenné, môžeme porovnávať aj premenné ostatných dátových typov pomocou metódy Compare.
Rozdiel medzi porovnateľným Vs komparátorom
Porovnateľné rozhranie | Porovnávacie rozhranie |
---|---|
Na triedenie prvkov sa používa Collections.sort (zoznam). | Na triedenie prvkov sa používa Collections.sort (List, Comparator). |
Porovnateľné rozhranie poskytuje triedenie jedného poľa. | Rozhranie komparátora poskytuje triedenie viacerých polí. |
Porovnateľné rozhranie triedi objekty podľa prirodzeného usporiadania. | Rozhranie komparátora triedi rôzne atribúty rôznych objektov. |
Pomocou porovnateľného rozhrania môžeme porovnať aktuálny objekt ‘this’ so zadaným objektom. | Pomocou porovnávacieho rozhrania môžeme porovnávať objekty rôznych tried. |
Súčasťou balíka java.lang. | Súčasťou balíka java.util. |
Použitie porovnateľného rozhrania upravuje skutočnú triedu. | Komparátor nezmení pôvodnú triedu. |
Poskytuje metódu porovnávania prvkov na porovnanie (). | Poskytuje metódu porovnávania () na triedenie prvkov. |
často kladené otázky
Otázka 1) Je porovnateľné funkčné rozhranie?
Odpoveď: Áno, porovnateľné je funkčné rozhranie. Deklaruje jednu abstraktnú metódu, compareTo ().
Otázka 2) Ako dosiahnete porovnateľnosť triedy?
Odpoveď: Implementáciou porovnateľného rozhrania vytvárame porovnateľnú triedu. V triede prepíšeme metódu compareTo (), aby sa objekt zoradil. Prejdeme okolo objektu a porovnáme ho s aktuálnym objektom.
Metóda compareTo () vráti 0, ak sú dva objekty rovnaké. Vráti záporné číslo, ak je prvý objekt menší ako druhý, a kladné, ak je prvý objekt väčší ako druhý objekt.
Otázka č. 3) Aký je hlavný účel rozhrania komparátora?
Odpoveď: Rozhranie komparátora sa používa hlavne na triedenie vlastných objektov. Na porovnanie objektov rôznych tried je možné použiť aj komparátorové rozhranie. Porovnávacie rozhranie je možné použiť aj na triedenie objektov vo viacerých poliach.
Otázka č. 4) Prečo sa komparátor používa v prostredí Java?
Odpoveď: Rozhranie komparátora sa používa hlavne vtedy, keď chceme pre naše vlastné objekty iné poradie triedenia, ako je prirodzené usporiadanie založené na viacerých poliach.
Otázka č. 5) Čo implementuje porovnateľné rozhranie?
Odpoveď: Porovnateľné rozhranie je implementované vo všetkých triedach wrapperov a String. Vlastné objekty tiež používajú na triedenie porovnateľné rozhranie.
Záver
V tomto tutoriáli sme diskutovali o porovnateľných a porovnávacích rozhraniach v Jave. Na triedenie objektov podľa prirodzeného usporiadania sa používa porovnateľné rozhranie, ktoré dokáže naraz triediť objekty iba na jednom poli.
Porovnateľné rozhranie má metódu ‘compareTo ()‘, ktorú je potrebné prepísať v triede implementujúcej rozhranie komparátora, a ktorej objekty sa majú triediť.
Rozhranie komparátora sa používa na triedenie vlastných objektov, ktoré sa majú triediť na základe iného poradia. Komparačné rozhranie nám tiež umožňuje triediť objekty dvoch rôznych tried na základe viacerých polí.
=> Prečítajte si sériu Easy Java Training Series.
Odporúčané čítanie
- Príručka k rozhraniu Java a abstraktnej triede
- Nastaviť rozhranie v prostredí Java: Výukový program sady Java s príkladmi
- Nasadenie Java: Vytvorenie a vykonanie súboru Java JAR
- Základy jazyka Java: Java Syntax, trieda Java a základné koncepty Java
- Virtuálny stroj Java: Ako JVM pomáha pri spúšťaní aplikácií Java
- Rozhranie ListIterator v Jave s príkladmi
- Pole objektov v Jave: Ako vytvárať, inicializovať a používať
- Výukový program JAVA pre začiatočníkov: viac ako 100 praktických výučbových programov Java Video