comparable comparator interfaces java
Questo tutorial spiega il concetto di interfacce comparabili e di confronto in Java con esempi. Imparerai anche le differenze tra i due:
Abbiamo imparato tutto sulle interfacce nei nostri tutorial precedenti. Un'interfaccia viene utilizzata per dichiarare metodi astratti e variabili statiche o finali. Per impostazione predefinita, i metodi di interfaccia sono pubblici. A partire da Java 8, le interfacce possono anche avere metodi statici e predefiniti definiti in esse.
Java fornisce varie interfacce integrate che possiamo utilizzare per eseguire varie operazioni. In questo tutorial, discuteremo di due di queste interfacce, ovvero Comparable e Comparator. Un'interfaccia comparabile viene utilizzata per ordinare gli oggetti in base all'ordinamento naturale. L'interfaccia del comparatore viene utilizzata per ordinare singoli attributi di vari oggetti.
=> Esplora la serie di formazione Java semplice qui.
Cominciamo con un'interfaccia comparabile.
Cosa imparerai:
- Interfaccia comparabile in Java
- Interfaccia comparatore in Java
- Differenza tra comparabile vs comparatore
- Conclusione
Interfaccia comparabile in Java
L'interfaccia comparabile ordina le strutture dell'elenco come Arrays e ArrayLists contenenti oggetti personalizzati. Una volta che gli oggetti dell'elenco implementano l'interfaccia Comparable, possiamo quindi utilizzare il metodo Collections.sort () o Arrays.sort () nel caso degli array per ordinare i contenuti.
Ma quando abbiamo classi personalizzate e abbiamo bisogno di ordinare i loro oggetti, allora dovremo implementare l'interfaccia Comparable in questa classe. L'interfaccia Comparable fa parte di java.lang pacchetto. Questa interfaccia ha un solo metodo, CompareTo (). Utilizzando un'interfaccia comparabile, possiamo ordinare un singolo membro di dati alla volta.
Per esempio, se abbiamo nome ed età come campi nella nostra classe, alla volta possiamo ordinare gli oggetti della classe su nome o età. Non possiamo ordinare contemporaneamente sia il nome che l'età.
Come spiegato sopra, possiamo implementare l'interfaccia Comparable in Java disponendo di una classe personalizzata per implementare l'interfaccia Comparable. L'interfaccia Comparable ha un solo metodo 'compareTo' che deve essere sovrascritto nella classe per ordinare gli oggetti personalizzati.
Metodo 'CompareTo'
Il metodo 'compareTo' dell'interfaccia Comparable viene utilizzato per confrontare l'oggetto corrente con l'oggetto specificato. Di seguito viene fornita la sintassi generale dell'oggetto compareTo.
public int compareTo (Object obj)
Come mostrato sopra, il metodo compareTo accetta un oggetto come argomento (può essere qualsiasi oggetto personalizzato) e lo confronta con l'oggetto corrente utilizzato per richiamare questo metodo.
Il metodo compareTo restituisce un valore intero che può avere uno dei seguenti valori:
- Intero positivo (> 0) => l'oggetto corrente> il parametro dell'oggetto passato.
- Negativo (l'oggetto corrente
- Zero (= 0) => l'oggetto corrente e l'oggetto specificato sono entrambi uguali.
Possiamo usare il metodo compareTo () per ordinare:
- Oggetti di tipo stringa
- Oggetti classe wrapper
- Oggetti definiti dall'utente o personalizzati
Ora implementiamo un esempio di un'interfaccia Comparable.
Esempio di interfaccia comparabile
Il seguente programma Java implementa una classe Person che contiene nome ed età come campi membro. Questa classe implementa un'interfaccia 'Comparable' che ci permetterà di ordinare l'oggetto della classe Person.
Tieni presente che poiché ordineremo gli oggetti personalizzati, è necessario sostituire il metodo 'compareTo ()' dell'interfaccia Comparable.
come convertire un char in un int c ++
All'interno del metodo compareTo () sovrascritto, confrontiamo l'età dell'oggetto persona che viene passato con quella dell'oggetto corrente e di conseguenza restituiamo il valore.
Di seguito viene fornito un programma Java di esempio.
//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!'); } } }
Produzione:
Come si vede dall'output, utilizziamo un'interfaccia Comparable per confrontare due oggetti della classe Person in base alla variabile del membro dell'età.
Quindi, come suggerisce il nome, un'interfaccia Comparable ci consente di confrontare un oggetto con l'altro a condizione che gli oggetti siano dello stesso tipo. Finché gli oggetti sanno di organizzarsi da soli, possiamo ordinarli facilmente utilizzando l'unico metodo 'compareTo ()' che appartiene a questa interfaccia.
Metodo Java String CompareTo ()
Possiamo anche usare il metodo compareTo () per confrontare due oggetti di tipo String in Java. I due oggetti stringa vengono confrontati lessicograficamente convertendo ogni carattere dell'oggetto stringa nel suo carattere Unicode equivalente.
Se due stringhe sono uguali, viene restituito 0. Se il primo oggetto è maggiore del secondo oggetto, viene restituito un valore positivo e viene restituito un valore negativo se il primo oggetto stringa è minore del secondo oggetto String.
Per esempio,
string1.compareTo (string2) confronterà lessicograficamente stringa1 e stringa 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); } }
Produzione:
Nel programma sopra, abbiamo visto come utilizzare il metodo compareTo () per confrontare due stringhe. Prima di allora, abbiamo utilizzato il metodo compareTo () per confrontare i valori interi (età per esempio). Allo stesso modo, possiamo usare gli altri tipi di dati come double con il metodo compareTo ().
Ora passiamo all'interfaccia Comparator in Java.
Interfaccia comparatore in Java
Abbiamo già visto il funzionamento dell'interfaccia Comparable. L'interfaccia comparabile ci consente di ordinare gli oggetti personalizzati in base a un singolo membro di dati. Ma quando si presenta la necessità di ordinare l'oggetto in base a più campi o membri di dati, possiamo optare per un'interfaccia di confronto.
Utilizzando l'interfaccia del comparatore, possiamo creare più di un comparatore a seconda di quanti campi vogliamo utilizzare per ordinare gli oggetti personalizzati. Utilizzando l'interfaccia del comparatore, supponendo di voler ordinare l'oggetto personalizzato su due campi membro nome ed età, allora abbiamo bisogno di due comparatori, uno per nome e uno per età.
Quindi possiamo chiamare il metodo Collections.sort () con questi comparatori.
Quindi come possiamo scrivere esattamente i comparatori?
Considera un esempio di uno studente di classe con nome ed età come campo. Considera che vogliamo ordinare gli oggetti Studente sui campi nome ed età.
A tale scopo, dovremo prima scrivere classi Comparator, StudentAgeComparator e StudenNameComparator. In queste classi, sovrascriveremo il metodo compare () dell'interfaccia Comparator, quindi chiameremo il metodo Collections.sort utilizzando ciascuno di questi comparatori per ordinare gli oggetti studente.
L'interfaccia del comparatore contiene un oggetto 'confronta' che viene utilizzato per confrontare oggetti di due classi diverse. La sintassi generale del metodo di confronto è:
public int compare (Object obj1, Object obj2);
Il metodo di confronto confronta obj1 con obj2.
L'interfaccia Comparator fa parte di java.util pacchetto e oltre al metodo di confronto; contiene anche un altro metodo denominato uguale.
Esempio di comparatore Java
Implementiamo un esempio di comparatore in Java. Ancora una volta abbiamo preso una classe Student con nome ed età come membri dei dati. Quindi definiamo una classe di confronto AgeComparator che sostituisce il metodo di confronto per confrontare le età di due studenti e restituire valori appropriati.
Nel metodo principale, costruiamo un Arraylist di oggetti Student. Quindi chiamiamo il metodo Collections.sort con gli oggetti ArrayList e AgeComparator come argomenti. Questo ordina gli oggetti Studente in base all'età.
Di seguito viene fornito il programma Java che implementa questo scenario.
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); } } }
Produzione:
Nel programma precedente, in modo simile al modo in cui abbiamo scritto AgeComparator per ordinare gli oggetti Student in base all'età, possiamo anche scrivere un altro NameComparator per ordinare gli oggetti Student in base al campo del nome.
In questo modo possiamo avere tutte le classi di Comparator necessarie per ordinare gli oggetti in vari campi. Il modo in cui abbiamo confrontato due variabili int, possiamo anche confrontare le variabili degli altri tipi di dati utilizzando il metodo Compare.
Differenza tra comparabile vs comparatore
Interfaccia comparabile | Interfaccia comparatore |
---|---|
Utilizza Collections.sort (List) per ordinare gli elementi. | Utilizza Collections.sort (List, Comparator) per ordinare gli elementi. |
L'interfaccia comparabile fornisce l'ordinamento di un singolo campo. | L'interfaccia del comparatore fornisce l'ordinamento di più campi. |
L'interfaccia comparabile ordina gli oggetti secondo l'ordinamento naturale. | L'interfaccia del comparatore ordina vari attributi di oggetti diversi. |
Utilizzando un'interfaccia comparabile possiamo confrontare l'oggetto corrente 'this' con l'oggetto specificato. | Utilizzando un'interfaccia di confronto, possiamo confrontare oggetti di classi diverse. |
Parte del pacchetto java.lang. | Parte del pacchetto java.util. |
L'uso di un'interfaccia Comparable modifica la classe effettiva. | Il comparatore non altera la classe originale. |
Fornisce il metodo compareTo () per ordinare gli elementi. | Fornisce il metodo compare () per ordinare gli elementi. |
Domande frequenti
D # 1) È paragonabile un'interfaccia funzionale?
Risposta: Sì, paragonabile è un'interfaccia funzionale. Dichiara un unico metodo astratto, compareTo ().
D # 2) Come si rende confrontabile una classe?
Risposta: Rendiamo una classe comparabile implementando l'interfaccia Comparable. All'interno della classe, sovrascriviamo il metodo compareTo () per ordinare l'oggetto. Passiamo un oggetto e lo confrontiamo con l'oggetto corrente.
Il metodo compareTo () restituisce 0 se due oggetti sono uguali. Restituisce un numero negativo se il primo oggetto è minore del secondo e positivo se il primo oggetto è maggiore del secondo oggetto.
D # 3) Qual è lo scopo principale dell'interfaccia di Comparator?
Risposta: L'interfaccia del comparatore viene utilizzata principalmente per ordinare gli oggetti personalizzati. Un'interfaccia di confronto può essere utilizzata anche per confrontare oggetti di classi diverse. Inoltre, l'interfaccia di confronto può essere utilizzata per ordinare gli oggetti in più campi.
D # 4) Perché il comparatore viene utilizzato in Java?
Risposta: L'interfaccia del comparatore viene utilizzata principalmente quando vogliamo un ordine di ordinamento diverso per i nostri oggetti personalizzati diverso dall'ordinamento naturale basato su più campi.
D # 5) Cosa implementa l'interfaccia Comparable?
Risposta: L'interfaccia comparabile è implementata da tutte le classi wrapper e dalla classe String. Gli oggetti personalizzati utilizzano anche l'interfaccia comparabile per l'ordinamento.
Conclusione
In questo tutorial, abbiamo discusso le interfacce comparabili e di confronto in Java. Un'interfaccia comparabile viene utilizzata per ordinare gli oggetti secondo l'ordine naturale e alla volta può ordinare gli oggetti solo su un campo.
L'interfaccia comparabile ha un metodo 'compareTo ()' che deve essere sovrascritto nella classe che implementa l'interfaccia Comparator e i cui oggetti devono essere ordinati.
L'interfaccia del comparatore viene utilizzata per ordinare gli oggetti personalizzati che devono essere ordinati in base a qualsiasi altro ordine. L'interfaccia del comparatore ci consente anche di ordinare oggetti di due classi diverse in base a più campi.
=> Leggere attraverso la serie di formazione Easy Java.
Lettura consigliata
- Tutorial sull'interfaccia Java e sulla classe astratta con esempi
- Set Interface In Java: Java Set Tutorial with examples
- Distribuzione Java: creazione ed esecuzione di file JAR Java
- Nozioni di base su Java: sintassi Java, classe Java e concetti principali di Java
- Java Virtual Machine: come JVM aiuta nell'esecuzione di applicazioni Java
- ListIterator Interface in Java con esempi
- Matrice di oggetti in Java: come creare, inizializzare e utilizzare
- Tutorial JAVA per principianti: oltre 100 tutorial video Java pratici