2012-02-07 20 views
34

Mi è capitato di imbattersi in molte affermazioni come quelle paragonabili utilizzate quando è richiesto l'ordinamento naturale mentre si ordina un array o una raccolta e un comparatore per l'ordinamento totale.differenza tra ordinamento naturale e ordinamento totale

La versione di ciò che si ascolta può essere uguale o diversa con lo stesso significato ma in definitiva è uno dei fattori di distinzione tra i due (comparatore e interfacce confrontabili).

Ma, da nessuna parte ho potuto trovare una differenza tra i due tipi di ordinamento. Se qualcuno può spiegarlo con un buon esempio, sarà molto apprezzato :)

risposta

25

L'ordine totale indica che tutti i valori possono essere confrontati con tutti gli altri valori. Ad esempio, se si dispone di una raccolta die String non esiste un ordine totale naturale (ma è possibile inventarne uno)

In Java, l'ordine Naturale è definito come l'ordine fornito dalla JVM. Questo potrebbe non corrispondere a quello che una gente potrebbe credere sia l'ordine naturale. per esempio. Le stringhe sono ordinate ASCIIbeticamente. significato Z viene prima a e 10 è prima 2

http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

Questa interfaccia impone un ordinamento totale sugli oggetti di ogni classe che implementa. Questo ordine è indicato come l'ordinamento naturale della classe e il metodo compareTo della classe viene indicato come il suo metodo di confronto naturale.

+2

Cosa intendi esattamente per ** tutti i valori possono essere confrontati con tutti gli altri valori. ** Puoi approfondire questo argomento? – AnV

+1

@AbhinavVutukuri nella raccolta puoi dire che alcuni sono comparabili e altri no. Tutti i valori devono essere confrontabili con ogni altro valore. –

4

L'ordinamento naturale è un ordine totale predefinito. Questa è l'unica differenza tra i due.

+1

Questo è quello che non ho ricevuto. È come un indovinello per me. puoi spiegare per favore cosa intendi per ordinamento predefinito – Nav

+0

è _natural_: D – UmNyobe

+0

lol lo so ma come ho detto non l'ho capito bene quando hai detto causa naturale il significato è ambiguo da capire per me :( – Nav

8

Total ordering è un concetto matematico generale. Si differenzia principalmente da ordinamento parziale dal fatto che per ogni un e b in serie X, sia "un < = b" o "b < = a" sono significativa e vera. Per quanto Java è interessato, questo significa che due Comparable casi, si deve essere maggiore o uguale rispetto all'altro (cioè ha senso confrontarli).

9

Natural Order

Dipende nostre collezioni che usiamo, ad esempio, ad esempio, abbiamo caratteri obiettare, poi ordine naturale è la loro valori Unicode, per i numeri di ordine naturale è come al solito, ordine crescente

comparabile Interfacce Questa interfaccia impone un ordinamento totale sugli oggetti di ogni classe che implementa. Questo ordinamento è indicato come ordinamento naturale della classe, e il metodo compareTo della classe si riferisce a come il suo metodo di confronto naturale.

elenchi (e array) di oggetti che implementano questa interfaccia possono essere ordinati automaticamente da Collections.sort (e Arrays.sort). Gli oggetti che implementano questa interfaccia possono essere utilizzati come chiavi in ​​una mappa ordinata o elementi in un insieme ordinato, senza la necessità di specificare un comparatore.

public interface Comparable<T> { 

    /** 
    * Compares this object with the specified object for order. Returns a 
    * negative integer, zero, or a positive integer as this object is less 
    * than, equal to, or greater than the specified object. 
    */ 
    public int compareTo(T o); 
} 

Comparatore di interfaccia:

Questa interfaccia rappresenta una relazione d'ordine, che può essere utilizzato per ordinare un elenco o mantenere l'ordine in un insieme ordinato o una mappa. Può sostituire l'ordinamento naturale di un tipo o ordinare oggetti di un tipo che non implementa l'interfaccia Comparable.

Una funzione di confronto, che impone un ordinamento totale su "alcune raccolte di oggetti". I comparatori possono essere passati a un metodo di ordinamento (come Collections.sort) per consentire un controllo preciso sull'ordinamento. I comparatori possono anche essere utilizzati per controllare l'ordine di alcune strutture di dati (come TreeSet o TreeMap).

public interface Comparator<T> { 
    /** 
    * Compares its two arguments for order. Returns a negative integer, 
    * zero, or a positive integer as the first argument is less than, equal 
    * to, or greater than the second. 
    */ 
    int compare(T o1, T o2); 

    boolean equals(Object obj); 
} 

Hope This helps you.      
6

punto importante:naturale ordinamento dovrebbe essere coerente con uguale!

Sommario: L'ordinamento naturale è un tipo di ordinamento totale che è predefinito (utilizzato il più spesso) per la classe data ed è coerente con gli uguali. L'ordine totale è qualsiasi ordine in cui tutti i valori possono essere confrontati con tutti gli altri valori.

ad es. quando progetti una nuova classe, puoi scegliere l'ordine naturale all'interno della classe. Qualsiasi altro ordine può essere allora solo quello totale;)

+1

Che cosa intendi esattamente per ** tutti i valori possono essere confrontati con tutti gli altri valori. ** Puoi approfondire questo argomento? – AnV

2

di approfondire @ risposta di Bruno: un esempio di un ordinamento parzialeè il rapporto divisibilità tra numeri positivi. Se confronti 5 e 15, puoi dire che 5 è un divisore di 15 e 15 è il multiplo di 5. Tuttavia, 3 e 5 non sono confrontabili perché 3 non è né il divisore né il multiplo di 5.

Un esempio di per l'ordine totale è il inferiore alla relazione, perché se si prendono due numeri diversi, uno di questi è inferiore all'altro. Quindi qualsiasi valore è paragonabile a qualsiasi altro valore.

Sul concetto di ordinamento naturale: Se gli oggetti di un tipo hanno un modo davvero ovvio per essere ordinati, che è l'ordinamento naturale. Ad esempio, l'ordinamento naturale delle stringhe è l'ordine alfabetico, e l'ordine naturale dei numeri è l'ordine ascendente, perché è la prima scelta a cui qualcuno penserebbe. Tuttavia, a volte vorresti ordinare le stringhe in un modo diverso, ad es. ordinamento per lunghezza da quelli a 1 carattere a quelli più lunghi. Questo è un possibile ordine totale su stringhe, ma non quello naturale.

Non tutti gli oggetti hanno necessariamente un ordinamento naturale. Per esempio. se hai oggetti Person, ordinarli in base all'altezza è un possibile ordinamento totale, ma così li ordina per età ... Nessuno di questi è più ovvio dell'altro, questo è il motivo per cui non esiste un ordinamento naturale.