Ho visto classi che implementano sia Comparable che Comparator . Cosa significa questo? Perché dovrei usarne uno sopra l'altro?
Ho visto classi che implementano sia Comparable che Comparator . Cosa significa questo? Perché dovrei usarne uno sopra l'altro?
Risposte:
Il testo seguente proviene da Comparator vs Comparable
paragonabile
Un oggetto comparabile è in grado di confrontarsi con un altro oggetto. La classe stessa deve implementare l' java.lang.Comparable
interfaccia per poter confrontare le sue istanze.
comparatore
Un oggetto comparatore è in grado di confrontare due diversi oggetti. La classe non sta confrontando le sue istanze, ma alcune istanze di altre classi. Questa classe di comparazione deve implementare l' java.util.Comparator
interfaccia.
Implementare Comparable
significa " Posso confrontare me stesso con un altro oggetto " . Ciò è generalmente utile quando esiste un unico confronto predefinito naturale.
Implementare Comparator
significa " Sono in grado di confrontare altri due oggetti " . Ciò è in genere utile quando esistono più modi di confrontare due istanze di un tipo, ad esempio è possibile confrontare le persone per età, nome, ecc.
Person
attrezzo Comparable
, perché non puoi quindi cambiare il modo in cui due persone vengono confrontate.
Person
. 2) Il comparatore, ad esempio PersonAgeComparator
che è in grado di confrontare due entità diverse e decidere quale dovrebbe venire prima in quel particolare ordinamento. 3) Il codice di ordinamento, che accetta una raccolta di entità e un comparatore, e ordina quella raccolta utilizzando il comparatore per determinare l'ordine.
Comparable consente a una classe di implementare il proprio confronto:
Per confronto, Comparator è un confronto esterno:
In entrambe le implementazioni, puoi comunque scegliere ciò che desideri confrontare . Con generics, puoi dichiararlo e farlo controllare in fase di compilazione. Ciò migliora la sicurezza, ma è anche una sfida determinare il valore appropriato.
Come linea guida, generalmente utilizzo la classe o l'interfaccia più generale alla quale l'oggetto potrebbe essere confrontato, in tutti i casi d'uso che immagino ... Tuttavia, non una definizione molto precisa! :-(
Comparable<Object>
ti permette di usarlo in tutti i codici in fase di compilazione (che è buono se necessario, o cattivo in caso contrario e perdi l'errore di compilazione); l'implementazione deve far fronte agli oggetti e lanciare secondo necessità, ma in modo robusto.Comparable<Itself>
è molto severo al contrario.Divertente, quando si esegue la sottoclasse in sottoclasse, anche la sottoclasse deve essere comparabile ed essere solida (o infrangerebbe il principio di Liskov e ti darebbe errori di runtime).
java.lang.Comparable
Per implementare l' Comparable
interfaccia, la classe deve implementare un singolo metodocompareTo()
int a.compareTo(b)
È necessario modificare la classe di cui si desidera ordinare l'istanza. In questo modo è possibile creare una sola sequenza di ordinamento per classe.
java.util.Comparator
Per implementare l'interfaccia Comparator, la classe deve implementare un singolo metodo compare()
int compare (a,b)
Comparable
di solito è preferito. Ma a volte una classe implementa già Comparable
, ma vuoi ordinare su una proprietà diversa. Quindi sei costretto a usare a Comparator
.
Alcune classi in realtà prevedono Comparators
casi comuni; per esempio, String
per impostazione predefinita s sono sensibili al maiuscolo / minuscolo quando sono ordinati, ma esiste anche una Comparator
chiamata statica CASE_INSENSITIVE_ORDER
.
qui ci sono alcune differenze tra Comparator e Comparable che ho trovato sul web:
Se vedi che la differenza logica tra questi due è Comparator in Java confronta due oggetti forniti a lui, mentre l'interfaccia Comparable confronta "questo" riferimento con l'oggetto specificato.
Comparable in Java viene utilizzato per implementare l'ordinamento naturale dell'oggetto. In Java API String, le classi Date e wrapper implementano l'interfaccia Comparable.
Se una classe implementa un'interfaccia comparabile in Java, la raccolta di quell'oggetto List o Array può essere ordinata automaticamente utilizzando il metodo Collections.sort () o Array.sort () e l'oggetto verrà ordinato in base all'ordine naturale definito dal metodo CompareTo.
Gli oggetti che implementano Comparable in Java possono essere usati come chiavi in una mappa ordinata o elementi in un set ordinato, ad esempio TreeSet, senza specificare alcun Comparatore.
sito: come utilizzare Comparator e Comparable in Java? Con esempio
Ulteriori informazioni: Come utilizzare Comparator e Comparable in Java? Con esempio
Comparable
è per oggetti con un ordinamento naturale. L'oggetto stesso sa come deve essere ordinato.
Comparator
è per oggetti senza un ordine naturale o quando si desidera utilizzare un ordine diverso.
Differenza tra interfacce Comparator e Comparable
Comparable
viene utilizzato per confrontarsi utilizzando un altro oggetto.
Comparator
viene utilizzato per confrontare due tipi di dati sono oggetti.
Se vedi allora la differenza logica tra questi due è Comparator
in Java confrontare due oggetti forniti a lui, mentre l' Comparable
interfaccia confronta "questo" riferimento con l'oggetto specificato.
Comparable
in Java viene utilizzato per implementare l'ordinamento naturale dell'oggetto. In Java API String, Date e classi wrapper implementano l' Comparable
interfaccia.
Se una qualsiasi classe implementa l' Comparable
interfaccia in Java, allora la raccolta di quell'oggetto List
o Array
può essere ordinata automaticamente usando Collections.sort()
o Array.sort()
metodo e l'oggetto verranno ordinati in base all'ordine naturale definito dacompareTo
metodo.
Gli oggetti che implementano Comparable
in Java possono essere utilizzati come chiavi in una mappa ordinata o elementi in un set ordinato, ad esempio TreeSet
, senza specificarne Comparator
.
La mia libreria di annotazioni per l'implementazione di Comparable and Comparator:
public class Person implements Comparable<Person> {
private String firstName;
private String lastName;
private int age;
private char gentle;
@Override
@CompaProperties({ @CompaProperty(property = "lastName"),
@CompaProperty(property = "age", order = Order.DSC) })
public int compareTo(Person person) {
return Compamatic.doComparasion(this, person);
}
}
Fai clic sul link per vedere altri esempi. compamatic