comparable comparator interfaces java
Aquest tutorial explica el concepte d’interfícies comparables i comparadores a Java amb exemples. També coneixereu les diferències entre els dos:
Vam aprendre tot sobre les interfícies als nostres tutorials anteriors. S'utilitza una interfície per declarar mètodes abstractes i variables estàtiques o finals. Per defecte, els mètodes d'interfície són públics. Des de Java 8, les interfícies també poden tenir mètodes estàtics i predeterminats definits.
Java proporciona diverses interfícies integrades que podem utilitzar per realitzar diverses operacions. En aquest tutorial, parlarem de dues interfícies d’aquest tipus, és a dir, Comparable i Comparator. S'utilitza una interfície comparable per ordenar objectes segons l'ordenació natural. La interfície comparadora s'utilitza per ordenar atributs individuals de diversos objectes.
=> Exploreu aquí la sèrie d'entrenament de Java simple.
Comencem amb una interfície comparable.
Què aprendreu:
- Interfície comparable a Java
- Interfície de comparació en Java
- Diferència entre comparador comparable contra
- Conclusió
Interfície comparable a Java
La interfície comparable ordena les estructures de llista, com ara Matrius i ArrayLists que contenen objectes personalitzats. Un cop els objectes de la llista implementin una interfície comparable, podem utilitzar el mètode Collections.sort () o Arrays.sort () en cas de les matrius per ordenar el contingut.
Però quan tinguem classes personalitzades i necessitem ordenar els seus objectes, haurem d’implementar la interfície comparable d’aquesta classe. La interfície comparable és una part del java.lang paquet. Aquesta interfície només té un mètode, CompareTo (). Mitjançant una interfície comparable, podem ordenar un sol membre de dades alhora.
Per exemple, si tenim el nom i l'edat com a camps de la nostra classe, alhora podem ordenar els objectes de la classe per nom o edat. No podem ordenar simultàniament tant pel nom com per l’edat.
Com s'ha explicat anteriorment, podem implementar la interfície comparable a Java tenint una classe personalitzada per implementar la interfície comparable. La interfície comparable només té un mètode 'compareTo' que s'ha de substituir a la classe per ordenar els objectes personalitzats.
Mètode 'CompareTo'
El mètode 'compareTo' de la interfície comparable s'utilitza per comparar l'objecte actual amb l'objecte donat. A continuació es mostra la sintaxi general de l’objecte compareTo.
public int compareTo (object object)
Com es mostra més amunt, el mètode compareTo accepta un objecte com a argument (pot ser qualsevol objecte personalitzat) i el compara amb l'objecte actual utilitzat per invocar aquest mètode.
El mètode compareTo retorna un valor enter que pot tenir un dels valors següents:
- Positiu (> 0) enter => l'objecte actual> el paràmetre de l'objecte passat.
- Negatiu (l'objecte actual
- Zero (= 0) => l'objecte actual i l'objecte especificat són iguals.
Podem utilitzar el mètode compareTo () per ordenar:
- Objectes de tipus cadena
- Objectes de classe Wrapper
- Objectes definits per l'usuari o personalitzats
Ara implementem un exemple d’interfície comparable.
Exemple d'interfície comparable
El següent programa Java implementa una classe Person que conté el nom i l'edat com a camps membres. Aquesta classe implementa una interfície 'comparable' que ens permetrà ordenar l'objecte de la classe Person.
Tingueu en compte que a mesura que anem a ordenar objectes personalitzats, hem d’anul·lar el mètode ‘compareTo ()’ de la interfície comparable.
convertir char a int en c ++
Dins del mètode anul·lat compareTo (), comparem l’edat de l’objecte persona que es passa amb la de l’objecte actual i, en conseqüència, retornem el valor.
A continuació es mostra un exemple de programa 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!'); } } }
Sortida:
Tal com es veu a la sortida, fem servir una interfície comparable per comparar dos objectes de la classe Person segons la variable membre d'edat.
Així, com el seu nom indica, una interfície comparable ens permet comparar un objecte amb l’altre sempre que els objectes siguin del mateix tipus. Sempre que els objectes sàpiguen disposar-se, podem ordenar els objectes fàcilment mitjançant l’únic mètode ‘compareTo ()’ que pertany a aquesta interfície.
Mètode Java String CompareTo ()
També podem utilitzar el mètode compareTo () per comparar dos objectes de tipus String a Java. Els dos objectes de cadena es comparen lexicogràficament convertint cada caràcter de l'objecte de cadena en el seu caràcter Unicode equivalent.
Si dues cadenes són iguals, es retorna 0. Si el primer objecte és més gran que el segon objecte, es retorna un valor positiu i es torna un valor negatiu si el primer objecte de cadena és inferior al segon objecte de cadena.
Per exemple,
string1.compareTo (string2) compararà lexicogràficament string1 i string 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); } }
Sortida:
Al programa anterior, vam veure com utilitzar el mètode compareTo () per comparar dues cadenes. Abans d’això, hem utilitzat el mètode compareTo () per comparar els valors enters (per exemple, l’edat). De la mateixa manera, podem utilitzar els altres tipus de dades, com ara dobles, amb el mètode compareTo ().
Passem ara a la interfície Comparator de Java.
Interfície de comparació en Java
Ja hem vist el funcionament de la interfície comparable. La interfície comparable ens permet ordenar objectes personalitzats basats en un sol membre de dades. Però quan sorgeix el requisit d’ordenar l’objecte en funció de diversos camps o membres de dades, podem optar per una interfície de comparació.
Mitjançant la interfície Comparator, podem crear més d’un comparador en funció del nombre de camps que vulguem utilitzar per ordenar els objectes personalitzats. Mitjançant la interfície de comparació, suposant que volem ordenar l’objecte personalitzat en dos camps de membres, nom i edat, hem de tenir dos comparadors, un per nom i un per edat.
Llavors podem anomenar el mètode Collections.sort () amb aquests comparadors.
Llavors, com podem escriure exactament els comparadors?
Penseu en un exemple d’un estudiant de classe amb el camp i el nom i l’edat. Tingueu en compte que volem ordenar els objectes dels estudiants en els camps de nom i edat
Per a aquest propòsit, primer haurem d’escriure classes de Comparator, StudentAgeComparator i StudenNameComparator. En aquestes classes, substituirem el mètode compare () de la interfície Comparator i, a continuació, anomenarem el mètode Collections.sort mitjançant cadascun d’aquests comparadors per ordenar els objectes dels estudiants.
La interfície de comparació conté un objecte 'compara' que s'utilitza per comparar objectes de dues classes diferents. La sintaxi general del mètode de comparació és:
public int compare (Object obj1, Object obj2);
El mètode de comparació compara object1 amb obj2.
La interfície Comparator forma part del java.util package i a part del mètode de comparació; també conté un altre mètode anomenat igual.
Exemple de comparador de Java
Implantem un exemple de comparador a Java. Novament hem pres una classe d'estudiants amb el nom i l'edat com a membres de les seves dades. A continuació, definim una classe comparadora AgeComparator que substitueix el mètode de comparació per comparar les edats de dos estudiants i retornar els valors adequats.
En el mètode principal, construïm un Arraylist d'objectes estudiantils. A continuació, anomenem mètode Collections.sort amb els objectes ArrayList i AgeComparator com a arguments. Això ordena els objectes de Student segons l'edat.
A continuació es mostra el programa Java que implementa aquest escenari.
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); } } }
Sortida:
Al programa anterior, de manera similar a la forma en què hem escrit AgeComparator per ordenar els objectes Student en funció de Age, també podem escriure un altre NameComparator per ordenar els objectes Student segons el camp del nom.
D'aquesta manera, podem tenir tantes classes de comparador com sigui necessari per ordenar objectes en diversos camps. La forma en què hem comparat dues variables int, també podem comparar variables dels altres tipus de dades mitjançant el mètode Compare.
Diferència entre comparador comparable contra
Interfície comparable | Interfície de comparació |
---|---|
Utilitza Collections.sort (Llista) per ordenar els elements. | Utilitza Collections.sort (llista, comparador) per ordenar els elements. |
La interfície comparable proporciona una classificació d’un camp únic. | La interfície de comparació proporciona una classificació de diversos camps. |
La interfície comparable classifica els objectes segons l’ordenació natural. | La interfície de comparació ordena diversos atributs de diferents objectes. |
Mitjançant una interfície comparable podem comparar l’objecte actual ‘this’ amb l’objecte especificat. | Mitjançant una interfície de comparació, podem comparar objectes de diferents classes. |
Part del paquet java.lang. | Part del paquet java.util. |
L'ús d'una interfície comparable modifica la classe real. | Comparador no altera la classe original. |
Proporciona el mètode compareTo () per ordenar els elements. | Proporciona el mètode compare () per ordenar els elements. |
Preguntes freqüents
P # 1) És comparable una interfície funcional?
Resposta: Sí, és comparable una interfície funcional. Declara un sol mètode abstracte, compareTo ().
Q # 2) Com es pot comparar una classe?
Resposta: Fem una classe comparable implementant la interfície Comparable. Dins de la classe, substituïm el mètode compareTo () per ordenar l'objecte. Passem un objecte i el comparem amb l’objecte actual.
El mètode compareTo () retorna 0 si dos objectes són iguals. Retorna un nombre negatiu si el primer objecte és inferior al segon i positiu si el primer objecte és superior al segon objecte.
P # 3) Quin és el propòsit principal de la interfície Comparador?
Resposta: La interfície de comparació s'utilitza principalment per ordenar els objectes personalitzats. També es pot utilitzar una interfície de comparació per comparar objectes de diferents classes. A més, la interfície de comparació es pot utilitzar per ordenar objectes en diversos camps.
Q # 4) Per què s'utilitza Comparator a Java?
Resposta: La interfície de comparació s'utilitza principalment quan volem un ordre d'ordenació diferent per als nostres objectes personalitzats que no sigui l'ordenació natural basada en diversos camps.
P # 5) Què implementa la interfície comparable?
Resposta: La interfície comparable és implementada per totes les classes de wrapper i String. Els objectes personalitzats també utilitzen la interfície comparable per ordenar.
Conclusió
En aquest tutorial, hem parlat d'interfícies comparables i comparatives a Java. S'utilitza una interfície comparable per ordenar els objectes segons l'ordenació natural i, alhora, pot ordenar els objectes només en un camp.
La interfície comparable té un mètode 'compareTo ()' que cal anul·lar a la classe que implementa la interfície Comparator i els objectes del qual s'han d'ordenar.
La interfície Comparator s'utilitza per ordenar objectes personalitzats que s'han d'ordenar en funció de qualsevol altre ordre. La interfície de comparació també ens permet ordenar objectes de dues classes diferents en funció de diversos camps.
=> Llegiu la sèrie de formació Java fàcil.
Lectura recomanada
- Interfície Java i tutoria de classes abstractes amb exemples
- Configuració de la interfície a Java: Tutorial de configuració de Java amb exemples
- Desplegament de Java: creació i execució del fitxer JAR de Java
- Conceptes bàsics de Java: sintaxi de Java, Java Class i conceptes bàsics de Java
- Màquina virtual Java: com ajuda JVM a executar aplicacions Java
- Interfície ListIterator a Java amb exemples
- Matriu d'objectes a Java: Com crear, inicialitzar i utilitzar
- Tutorial JAVA per a principiants: més de 100 tutorials pràctics de vídeo Java