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.Comparableinterfaccia 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.Comparatorinterfaccia.
Implementare Comparablesignifica " Posso confrontare me stesso con un altro oggetto " . Ciò è generalmente utile quando esiste un unico confronto predefinito naturale.
Implementare Comparatorsignifica " 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.
Personattrezzo Comparable, perché non puoi quindi cambiare il modo in cui due persone vengono confrontate.
Person. 2) Il comparatore, ad esempio PersonAgeComparatorche è 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' Comparableinterfaccia, 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)
Comparabledi 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 Comparatorscasi comuni; per esempio, Stringper impostazione predefinita s sono sensibili al maiuscolo / minuscolo quando sono ordinati, ma esiste anche una Comparatorchiamata 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 è Comparatorin Java confrontare due oggetti forniti a lui, mentre l' Comparableinterfaccia confronta "questo" riferimento con l'oggetto specificato.
Comparablein Java viene utilizzato per implementare l'ordinamento naturale dell'oggetto. In Java API String, Date e classi wrapper implementano l' Comparableinterfaccia.
Se una qualsiasi classe implementa l' Comparableinterfaccia in Java, allora la raccolta di quell'oggetto Listo Arraypuò 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 Comparablein 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