2010-11-05 19 views
112

Possibili duplicati:
difference between compare() and compareTo()
Java: What is the difference between implementing Comparable and Comparator?Java: Paragonabile vs comparatore

Quali sono le differenze tra i tasti comparabili e comparatore.

e quale è preferito rispetto agli altri in quali scenari?

Grazie

Aggiornato - buon collegamento con l'esempio !!

http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html

+2

http://grdurand.com/static/presentation_four/comparable.html –

+1

Inoltre, un duplicato di: [Quando utilizzare comparabili e Comparatori] (http://stackoverflow.com/q/2266827/642706). –

+0

Link di esempio eccellente. Semplice e chiaro Leggi. – Androidster

risposta

158

Quando la classe implementa Comparable, il metodo compareTo della classe sta definendo l'ordinamento "naturale" di quell'oggetto. Questo metodo è contrattualmente obbligato (anche se non richiesto) ad essere in linea con altri metodi su quell'oggetto, ad esempio deve essere sempre restituito uno 0 per gli oggetti quando i confronti .equals() restituiscono true.

A Comparator A è la propria definizione di come confrontare due oggetti e può essere utilizzato per confrontare gli oggetti in un modo che potrebbe non essere allineato con l'ordinamento naturale.

Ad esempio, le stringhe vengono generalmente confrontate in ordine alfabetico. Quindi lo "a".compareTo("b") userebbe confronti alfabetici. Se si desidera confrontare le stringhe su lunghezza, è necessario scrivere un comparatore personalizzato.

In breve, non c'è molta differenza. Sono entrambi fini a mezzi simili. In generale si può eseguire un confronto per l'ordine naturale (la definizione naturale dell'ordine è ovviamente aperta all'interpretazione) e scrivere un comparatore per altre esigenze di ordinamento o confronto.

+8

dovrebbe essere implementato all'interno dell'oggetto. Quindi esiste una dipendenza creata con il metodo compareTo per un oggetto che sarà implicito in un particolare tipo di implementazione del confronto di un oggetto. Ma il comparatore è esternalizzato e possiamo avere più tipi di comparatore per lo stesso oggetto. Anche bisogno di correzioni per la mia comprensione. – Sridhar

+0

Un caso che ho riscontrato è che potresti voler ordinare in modo condizionale qualsiasi campo a caso, in questo caso puoi passare Comparator in modo dinamico per ordinare una raccolta della classe, ma se vuoi semplicemente definire l'unicità su un'altra proprietà della classe, quindi Implementazione comparabile all'interno della classe. Non si escludono a vicenda. – markg

106

Comparator fornisce un modo per voi di fornire logica di confronto personalizzato per i tipi che avete alcun controllo.

Comparable consente di specificare come confrontare gli oggetti che si stanno implementando.

Ovviamente, se non si ha il controllo su una classe (o se si desidera fornire più modi per confrontare gli oggetti su cui si ha il controllo), utilizzare Comparator.

Altrimenti è possibile utilizzare Comparable.

+30

** Controllo sulla sorgente ** è la parola chiave qui. –

+0

@ JonasGröger Cosa intendi per non avere il controllo su una classe? – TheLogicGuy

+0

@TheLogicGuy Non hai il controllo su una classe se proviene da una dipendenza o da un altro codice che non puoi/non è autorizzato a cambiare. –