comparable comparator interfaces java
Acest tutorial explică conceptul de interfețe comparabile și comparatoare în Java cu exemple. De asemenea, veți afla despre diferențele dintre cele două:
Am aflat totul despre interfețe în tutorialele noastre anterioare. O interfață este utilizată pentru a declara metode abstracte și variabile statice sau finale. În mod implicit, metodele de interfață sunt publice. De la Java 8, interfețele pot avea și metode statice și implicite definite în ele.
Java oferă diverse interfețe încorporate pe care le putem folosi pentru a efectua diverse operații. În acest tutorial, vom discuta despre două astfel de interfețe, adică Comparable și Comparator. O interfață comparabilă este utilizată pentru sortarea obiectelor în funcție de ordinea naturală. Interfața de comparare este utilizată pentru a sorta atributele individuale ale diferitelor obiecte.
=> Explorați aici seria de antrenament Java simplă.
Să începem cu o interfață comparabilă.
Ce veți învăța:
- Interfață comparabilă în Java
- Interfață de comparare în Java
- Diferența dintre comparatorul Vs comparabil
- Concluzie
Interfață comparabilă în Java
Interfața comparabilă sortează structurile listelor, cum ar fi Array și ArrayLists, care conțin obiecte personalizate. Odată ce obiectele listă implementează interfața comparabilă, putem folosi metoda Collections.sort () sau Arrays.sort () în cazul matricelor pentru a sorta conținutul.
Dar când avem clase personalizate și trebuie să le sortăm obiectele, atunci va trebui să implementăm interfața comparabilă în această clasă. Interfața comparabilă face parte din java.lang pachet. Această interfață are o singură metodă, CompareTo (). Folosind o interfață comparabilă, putem sorta un singur membru de date la un moment dat.
De exemplu, dacă avem nume și vârstă ca câmpuri în clasa noastră, atunci la un moment dat putem sorta obiectele clasei pe nume sau vârstă. Nu putem sorta simultan atât pe nume, cât și pe vârstă.
Așa cum s-a explicat mai sus, putem implementa interfața comparabilă în Java având o clasă personalizată pentru a implementa interfața comparabilă. Interfața comparabilă are o singură metodă „compareTo”, care trebuie să fie suprascrisă în clasă pentru a sorta obiectele personalizate.
Metoda „CompareTo”
Metoda „compareTo” a interfeței comparabile este utilizată pentru a compara obiectul curent cu obiectul dat. Sintaxa generală a obiectului compareTo este dată mai jos.
public int compareTo (Object obj)
Așa cum se arată mai sus, metoda compareTo acceptă un obiect ca argument (poate fi orice obiect personalizat) și îl compară cu obiectul curent utilizat pentru a invoca această metodă.
Metoda compareTo returnează o valoare întreagă care poate avea una dintre următoarele valori:
- Pozitiv (> 0) întreg => obiectul curent> parametrul obiectului trecut.
- Negativ (obiectul curent
- Zero (= 0) => obiectul curent și obiectul specificat sunt ambele egale.
Putem folosi metoda compareTo () pentru a sorta:
- Obiecte de tip șir
- Obiecte din clasa Wrapper
- Obiecte definite de utilizator sau personalizate
Acum să implementăm un exemplu de interfață comparabilă.
Exemplu de interfață comparabilă
Următorul program Java implementează o clasă Persoană care conține numele și vârsta ca câmpuri membre. Această clasă implementează o interfață „comparabilă” care ne va permite să sortăm obiectul clasei Person.
Rețineți că, pe măsură ce vom sorta obiecte personalizate, trebuie să înlocuim metoda „compareTo ()” a interfeței comparabile.
întrebări și răspunsuri de bază ale interviului Java
În cadrul metodei compareTo () suprascris, comparăm vârsta obiectului persoană care este transmisă cu cea a obiectului curent și, în consecință, returnăm valoarea.
Un exemplu de program Java este dat mai jos.
//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!'); } } }
Ieșire:
După cum se vede din rezultat, folosim o interfață comparabilă pentru a compara două obiecte din clasa Persoană pe baza variabilei de vârstă.
Așa cum sugerează și numele, o interfață comparabilă ne permite să comparăm un obiect cu celălalt, cu condiția ca obiectele să fie de același tip. Atâta timp cât obiectele știu să se aranjeze singuri, putem sorta obiectele cu ușurință folosind singura metodă „compareTo ()” care aparține acestei interfețe.
Java String CompareTo () Method
Putem folosi și metoda compareTo () pentru a compara două obiecte de tip String în Java. Cele două obiecte șir sunt comparate lexicografic prin conversia fiecărui caracter al obiectului șir în caracterul Unicode echivalent.
Dacă două șiruri sunt egale, atunci se returnează 0. Dacă primul obiect este mai mare decât al doilea obiect, atunci se returnează o valoare pozitivă și o valoare negativă dacă primul obiect șir este mai mic decât al doilea obiect Șir.
De exemplu,
string1.compareTo (string2) va compara șirul 1 și șirul 2 lexicografic.
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); } }
Ieșire:
În programul de mai sus, am văzut cum să folosim metoda compareTo () pentru a compara două șiruri. Înainte de aceasta, am folosit metoda compareTo () pentru a compara valorile întregi (vârsta de exemplu). În mod similar, putem utiliza celelalte tipuri de date, cum ar fi duble, cu metoda compareTo ().
Acum să trecem la interfața Comparator din Java.
Interfață de comparare în Java
Am văzut deja funcționarea interfeței comparabile. Interfața comparabilă ne permite să sortăm obiecte personalizate pe baza unui singur membru de date. Dar când apare cerința de a sorta obiectul pe mai multe câmpuri sau membri de date, atunci putem opta pentru o interfață Comparator.
Folosind interfața Comparator, putem crea mai multe comparatoare în funcție de câmpurile pe care dorim să le folosim pentru a sorta obiectele personalizate. Folosind interfața de comparare, presupunând că vrem să sortăm obiectul personalizat pe două câmpuri membre, nume și vârstă, atunci trebuie să avem doi comparatori, unul pentru nume și unul pentru vârstă.
Apoi putem apela metoda Collections.sort () cu acești Comparatori.
Deci, cum putem scrie exact Comparatorii?
Luați în considerare un exemplu de elev de clasă cu numele și vârsta ca domeniu. Luați în considerare faptul că dorim să sortăm obiectele Student pe câmpurile de nume și vârstă.
În acest scop, va trebui să scriem mai întâi clase de comparator, StudentAgeComparator și StudenNameComparator. În aceste clase, vom suprascrie metoda compare () a interfeței Comparator și apoi vom apela metoda Collections.sort folosind fiecare dintre acești comparatori pentru a sorta obiectele studenților.
Interfața de comparare conține un obiect „comparați” care este utilizat pentru a compara obiecte din două clase diferite. Sintaxa generală a metodei de comparare este:
public int compare (Object obj1, Object obj2);
Metoda de comparare compară obj1 cu obj2.
Interfața Comparator face parte din java.util pachet și în afară de metoda de comparare; conține, de asemenea, o altă metodă numită egal.
Exemplu Java Comparator
Să implementăm un exemplu Comparator în Java. Din nou, am luat o clasă de studenți cu numele și vârsta ca membri ai acesteia. Apoi definim o clasă de comparare AgeComparator care anulează metoda de comparare pentru a compara vârstele a doi studenți și pentru a returna valorile corespunzătoare.
În metoda principală, construim un Arraylist de obiecte Student. Apoi numim metoda Collections.sort cu obiectele ArrayList și AgeComparator ca argumente. Aceasta sortează obiectele Student în funcție de vârstă.
Programul Java care implementează acest scenariu este dat mai jos.
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); } } }
Ieșire:
În programul de mai sus, similar modului în care am scris AgeComparator pentru a sorta obiectele Student pe baza Age, putem scrie și un alt NameComparator pentru a sorta obiectele Student pe baza câmpului de nume.
În acest fel putem avea cât mai multe clase de comparator necesare pentru a sorta obiecte în diverse domenii. Modul în care am comparat două variabile int, putem compara și variabilele celorlalte tipuri de date folosind metoda Comparare.
Diferența dintre comparatorul Vs comparabil
Interfață comparabilă | Interfață de comparare |
---|---|
Folosește Collections.sort (Listă) pentru a sorta elemente. | Folosește Collections.sort (List, Comparator) pentru a sorta elementele. |
Interfața comparabilă asigură sortarea unui singur câmp. | Interfața de comparare oferă sortarea câmpurilor multiple. |
Interfața comparabilă sortează obiectele conform ordonării naturale. | Interfața de comparare sortează diferite atribute ale diferitelor obiecte. |
Folosind o interfață comparabilă putem compara obiectul curent „acesta” cu obiectul specificat. | Folosind o interfață de comparare, putem compara obiecte din diferite clase. |
Parte a pachetului java.lang. | Parte a pachetului java.util. |
Utilizarea unei interfețe comparabile modifică clasa reală. | Comparatorul nu modifică clasa originală. |
Oferă metoda compareTo () pentru sortarea elementelor. | Oferă metoda compare () pentru sortarea elementelor. |
întrebări frecvente
Q # 1) Este comparabilă o interfață funcțională?
Răspuns: Da, comparabilă este o interfață funcțională. Declară o singură metodă abstractă, compareTo ().
Q # 2) Cum faci o clasă comparabilă?
Răspuns: Facem o clasă comparabilă prin implementarea interfeței comparabile. În cadrul clasei, anulăm metoda compareTo () pentru a sorta obiectul. Trecem un obiect și îl comparăm cu obiectul curent.
Metoda compareTo () returnează 0 dacă două obiecte sunt egale. Returnează un număr negativ dacă primul obiect este mai mic decât al doilea și pozitiv dacă primul obiect este mai mare decât al doilea obiect.
Î # 3) Care este scopul principal al interfeței Comparator?
Răspuns: Interfața de comparare este utilizată în principal pentru sortarea obiectelor personalizate. O interfață de comparare poate fi utilizată și pentru a compara obiecte din diferite clase. De asemenea, interfața de comparare poate fi utilizată pentru a sorta obiecte în mai multe câmpuri.
Q # 4) De ce se folosește Comparator în Java?
Răspuns: Interfața de comparare este utilizată în principal atunci când dorim o altă ordine de sortare pentru obiectele noastre personalizate, altele decât ordonarea naturală bazată pe mai multe câmpuri.
Q # 5) Ce implementează interfața comparabilă?
Răspuns: Interfața comparabilă este implementată de toate clasele wrapper și clasa String. Obiectele personalizate folosesc, de asemenea, interfața comparabilă pentru sortare.
Concluzie
În acest tutorial, am discutat despre interfețe comparabile și comparatoare în Java. O interfață comparabilă este utilizată pentru a sorta obiectele conform ordonării naturale și la un moment dat poate sorta obiectele doar pe un singur câmp.
Interfața comparabilă are o metodă „compareTo ()” care trebuie înlocuită în clasa care implementează interfața Comparator și ale cărei obiecte urmează a fi sortate.
Interfața Comparator este utilizată pentru a sorta obiecte personalizate care urmează să fie sortate în funcție de orice altă ordine. Interfața de comparare ne permite, de asemenea, să sortăm obiecte din două clase diferite pe baza câmpurilor multiple.
=> Citiți seria Easy Training Java.
Lectură recomandată
- Interfață Java și tutorial de clasă abstractă cu exemple
- Setați interfața în Java: Tutorial de setare Java cu exemple
- Implementarea Java: crearea și executarea fișierului Java JAR
- Noțiuni de bază Java: Sintaxă Java, Java Class și concepte de bază Java
- Mașină virtuală Java: Cum ajută JVM la rularea aplicației Java
- Interfață ListIterator în Java cu exemple
- Matrice de obiecte în Java: Cum se creează, se inițializează și se utilizează
- Tutorial JAVA pentru începători: peste 100 de cursuri video Java practice