Domanda

Ho visto classi che implementano entrambi Paragonabile E Comparatore.Cosa significa questo?Perché dovrei usarne uno piuttosto che l'altro?

È stato utile?

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

  1. Per implementare l'interfaccia Comparable, la classe deve implementare un singolo metodo compareTo()

    int a.compareTo(b)

  2. È 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

  1. Per implementare l'interfaccia Comparator, la classe deve implementare un singolo metodo compare()

    int compare (a,b)

  2. 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:

  1. 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.

  2. 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.

  3. 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.

  4. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top