2013-07-14 6 views
24

Apparentemente, non è documentato o l'ho perso.Qual è l'ordinamento di Collections.sort di Java (elenco, comparatore)? da piccolo a grande o da grande a piccolo?

Here s' il link alla documentazione e al di sotto è il testo come immagine:

EDIT (17/5): Penso che troppi confusi questa domanda per essere una domanda comparatore. Non è. Il comparatore confronta 2 elementi. Secondo quel confronto, la lista è stata ordinata. Come? Ascendente o Discendente?

sarò Affinare/semplificare la questione ancora di più: se il comparatore decide che elemento di A è minore elemento B. Nella lista ordinata, sarà elemento A essere situato ad un indice più piccolo elemento di B?

enter image description here

+2

Dipende da come hai scritto ' Comparator'? – sanbhat

+0

Hai esaminato l'API di 'Comparator'? Ti permette di definire il tuo ordinamento. –

+0

Si prega di guardare la mia modifica da 15/7. –

risposta

22

la sequenza è sempre ascendente, dove Confronto definisce quali elementi sono più grandi di altre.

Dalla documentazione per Collections.sort(List<T> list, Comparator<? super T> c):

sorta lista specificata secondo l'ordine indotta dal comparatore specificato.

Dalla documentazione per Comparator.compare(T,T):

raffronta la sua due argomenti per l'ordine. Restituisce un numero intero negativo, zero o un numero intero positivo poiché il primo argomento è minore, uguale o maggiore del secondo.

+2

Perché pensi che la lista ordinata sia crescente? –

+3

Osservazione. Dopo aver chiamato il metodo, l'elenco viene organizzato dal membro più piccolo a quello più grande, in base alla definizione fornita dal comparatore. Prima dell'osservazione, avrei indovinato l'ordine ascendente per il parallelismo con il metodo fratelli Collections.sort (Lista ), che * è * esplicitamente documentato come ordine ascendente. La documentazione per il metodo che stai utilizzando sarebbe migliorata menzionando esplicitamente l'ordine crescente, proprio come suo fratello. –

19

È (o meglio, il vostro comparatore) decide.

  • Se i Comparator 's compare(T o1, T o2) restituiscono un negativo quando o1 è inferiore a o2, si ottiene ordine (demo on ideone) ascendente.
  • Se il numero compare(T o1, T o2) di Comparator restituisce un valore negativo quando o1 è maggiore di o2, si ottiene l'ordine decrescente (demo on ideone).

Un altro modo per dire la stessa cosa sarebbe che sort presuppone che il comparatore ordina i due elementi passati in essa da piccole (o1) maggiore (o2), e produce un ordinamento crescente coerente con quella ordinamento.

+4

Un altro modo per vedere questo, più coerente con il contratto di Comparator, è che il Comparatore definisce quali elementi sono inferiori, uguali o maggiori di altri. –

+0

Non dovrebbe la seconda frase 'restituire un positivo quando o1 è minore di o2'? Altrimenti si ordinerebbe allo stesso modo della prima frase. – nif

+0

@nif Hai ragione, avrei dovuto "capovolgere" una parte della condizione, non entrambe. Grazie! – dasblinkenlight

2

La documentazione di Comparator.compareTo(o1, o2) metodo dice

raffronta la sua due argomenti per l'ordine. Restituisce un numero intero negativo, zero o un numero intero positivo poiché il primo argomento è inferiore a, uguale a o superiore al secondo.

Quindi, se si desidera ordinare da ordinamento naturale, che è piccolo al grande, allora si dovrebbe scrivere l'attuazione, come definito nella documentazione

public int compareTo(Integer o1, Integer o2) { 
    int v1 = (o1); 
    int v2 = (o2); 
    if(v1 == v2) { 
     return 0; 
    } 
    if(v1 < v2) { 
     return -1; //return negative integer if first argument is less than second 
    } 
    return 1; 
} 

Se si desidera che l'ordinamento per essere in ordine inverso , che è grande a piccolo

public int compareTo(Integer o1, Integer o2) { 
    int v1 = (o1); 
    int v2 = (o2); 
    if(v1 == v2) { 
     return 0; 
    } 
    if(v1 < v2) { 
     return 1; //do the other way 
    } 
    return -1; 
} 
0

Secondo documentazione https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator, l'attuazione di ordinamento per Collections.sort (elenco, il comparatore) è mergesort.

Dato che il risultato prodotto da mergeSort è crescente (https://en.wikipedia.org/wiki/Merge_sort), l'ordinamento di Collections.sort (elenco, comparatore) è crescente.

Vale a dire, se il comparatore decide che elemento di A è minore elemento B. Nella lista ordinata, elemento A sarà situato a un indice più piccolo elemento B.