Quando una classe dovrebbe essere Comparable e/o Comparator?[Chiuso]
-
10-07-2019 - |
Domanda
Ho visto classi che implementano entrambi Paragonabile E Comparatore.Cosa significa questo?Perché dovrei usarne uno piuttosto che l'altro?
Soluzione
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'interfaccia java.lang.Comparable
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 altre istanze di classe! Questa classe di confronto deve implementare l'interfaccia java.util.Comparator
.
Altri suggerimenti
L'implementazione di Comparable
significa " Posso confrontarmi con un altro oggetto. " Ciò è in genere utile quando esiste un unico confronto predefinito naturale.
L'implementazione di Comparator
significa " Posso confrontare altri due oggetti. " Ciò è in genere utile quando esistono più modi per confrontare due istanze di un tipo, ad es. potresti confrontare le persone per età, nome ecc.
Comparable consente a una classe di implementare il proprio confronto:
- è nella stessa classe (spesso è un vantaggio)
- può esserci una sola implementazione (quindi non puoi usarla se vuoi due casi diversi)
In confronto, Comparator è un confronto esterno:
- si trova in genere in un'istanza univoca (nella stessa classe o in un altro posto)
- tu assegna un nome a ciascuna implementazione con il modo in cui desideri ordinare le cose
- puoi fornire comparatori per classi che non controlli
- l'implementazione è utilizzabile anche se il primo oggetto è null
In entrambe le implementazioni, puoi ancora scegliere quello con cui vuoi essere confrontato . 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 consente di utilizzarlo in tutti i codici in fase di compilazione (il che è positivo se necessario o negativo in caso contrario e perdi l'errore di compilazione); l'implementazione deve far fronte agli oggetti e eseguire il cast 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 e affidabile (o infrange il principio di Liskov e ti dà errori di runtime).
java.lang.Comparable
-
Per implementare l'interfaccia
Comparable
, 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)
- Si crea una classe separata dalla classe di cui si desidera ordinare l'istanza. In modo che sia possibile creare più sequenze di ordinamento per classe.
Comparable
serve a fornire un ordine predefinito su oggetti dati, ad esempio se gli oggetti dati hanno un ordine naturale.
Un Comparator
rappresenta l'ordinamento stesso per un uso specifico.
Comparable
è generalmente preferito. Ma a volte una classe implementa già Comparator
, ma vuoi ordinare su una proprietà diversa. Quindi sei costretto a usare un Comparators
.
Alcune classi in realtà forniscono String
per casi comuni; ad esempio, CASE_INSENSITIVE_ORDER
sono di sensibile al maiuscolo / minuscolo predefinito quando ordinato, ma esiste anche un <=> statico chiamato <=> .
ecco alcune differenze tra Comparator e Comparable che ho trovato sul web:
Se vedi la differenza logica tra questi due, il Comparator in Java confronta due oggetti fornitigli, mentre l'interfaccia Comparable confronta "questo" riferimento con l'oggetto specificato.
Il comparabile in Java viene utilizzato per implementare l'ordinamento naturale degli oggetti.Nella stringa API Java, le classi Date e wrapper implementano l'interfaccia Comparable.
Se una classe implementa l'interfaccia Comparable 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 utilizzati come chiavi in una mappa ordinata o elementi in un insieme ordinato, ad esempio TreeSet, senza specificare alcun Comparator.
sito:Come utilizzare Comparator e Comparable in Java?Con l'esempio
Per saperne di più: Come utilizzare Comparator e Comparable in Java?Con l'esempio
Comparable
è per oggetti con un ordinamento naturale. L'oggetto stesso sa come deve essere ordinato.
Comparator
è per oggetti senza un ordinamento naturale o quando si desidera utilizzare un ordinamento diverso.
Differenza tra comparatore e interfacce comparabili
Comparable
viene utilizzato per confrontarsi utilizzando un altro oggetto.
Comparator
viene utilizzato per confrontare due tipi di dati sono oggetti.
Se vedi, la differenza logica tra questi due è Comparator
in Java confronta due oggetti fornitigli, mentre Comparable
l'interfaccia confronta "questo" riferimento con l'oggetto specificato.
Comparable
in Java viene utilizzato per implementare l'ordinamento naturale degli oggetti.In Java API String, implementano le classi Date e wrapper Comparable
interfaccia.
Se qualche classe implementa Comparable
interfaccia in Java e quindi anche la raccolta di quell'oggetto List
O Array
può essere ordinato automaticamente utilizzando Collections.sort()
O Array.sort()
il metodo e l'oggetto verranno ordinati in base all'ordine naturale definito da compareTo
metodo.
Oggetti che implementano Comparable
in Java possono essere utilizzati, ad esempio, come chiavi in una mappa ordinata o come elementi in un insieme ordinato TreeSet
, senza specificarne alcuno 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