2014-10-06 7 views
5

Stavo controllando un post che voleva sapere come usare Comparator e un Orange frutto di essere il primo tutto il tempo. Dal metodo post toString mancava così ho aggiunto al mio codiceArrays.parallelSort vs Collections.sort

@Override 
public String toString(){ 
    return fruitName +" " + fruitDesc; 
} 

La data risposta al post è stato

uso Collection.sort

Collections.sort(fruits, new Comparator<Fruit>() { 
     @Override 
     public int compare(Fruit o1, Fruit o2) { 
      if (o1.getFruitName() != null && o1.getFruitName().equalsIgnoreCase("orange")){ 
       return -1; 
      } 

      if (o2.getFruitName() != null && o2.getFruitName().equalsIgnoreCase("orange")){ 
       return 1; 
      } 

      return o1.getFruitName().compareTo(o2.getFruitName()); 
     } 
    }); 

uscita:

Orange Orange description 
Apple Apple description 
Banana Banana description 
Pineapple Pineapple description 

Stavo pensando perché non Arrays.parallelSort che mi è stato detto cose buone su

read more here

utilizzando Arrays.parallelSort codice

Fruit[] arrayFruits = fruits.stream().toArray(Fruit[]::new); 
Arrays.parallelSort(arrayFruits, (Fruit o1, Fruit o2) -> { 
    if (o1.getFruitName() != null && o1.getFruitName().equalsIgnoreCase("orange")){ 
     return -1; 
    } 
    if (o2.getFruitName() != null && o2.getFruitName().equalsIgnoreCase("orange")){ 
     return 1; 
    } 
     return o1.getFruitName().compareTo(o2.getFruitName()); 
    }); 

uscita:

Pineapple Pineapple description 
Apple Apple description 
Orange Orange description 
Banana Banana description 

The link to the post is here

Per me l'ordinamento è l'ordinamento, perché una risposta diversa forma un metodo diverso?

+0

fa questi [collegamento1] (http://stackoverflow.com/questions/17328077/difference-between-arrays-sort-and-arrays-parallelsort) e [link2] (http://java.dzone.com/ articoli/arrayssort-versus) ti aiutano. –

+0

@ ankur-singhal grazie, ma ho già controllato –

+0

@KickButtowski: sei sicuro di aver eseguito correttamente il programma. Indipendentemente dall'ordine in cui inserisco i valori, 'Orange' viene posto per primo. –

risposta

4

Se si esegue il programma in TryJava8, ottengo la matrice ordinata correttamente. Penso che probabilmente hai stampato l'input (fruits) anziché l'output (arrayFruits). Detto questo, hai aperto un argomento interessante, dal momento che, in generale, hai ragione un algoritmo di ordinamento non garantisce l'intero ordine. In generale per array di grandi dimensioni, se due elementi sono equivalenti, ma non uguali (ad esempio un diverso puntatore a un record equivalente), gli algoritmi non garantiscono un ordine specifico. Questo detto legame è in genere rotto in modo diverso da diversi algoritmi.

Un confrontare metodo dovrebbe soddisfare i ordine vincoli di relazione:

Una relazione d'ordine dovrebbe essere:

  • riflessiva: ogni elemento deve essere uguale a se stesso (si ritorna meglio 0 immagino)
  • asimmetrico: se A è inferiore o uguale a B e B è inferiore o uguale a A, A e B sono uguali.
  • transitiva: se A è minore o uguale a B e B è minore o uguale a C, Un è minore o uguale a C.

La maggior parte degli algoritmi di ordinamento assumersi questa vincoli implicitamente (non controllano loro) e quindi offrire un O (n log n) complessità temporale. Se la condizione non regge, a seconda dell'implementazione dell'algoritmo, si ottengono risultati diversi.

Poiché un ordinamento parallelo utilizza l'algoritmo MergeSort e un ordinamento predefinito utilizza l'algoritmo QuickSort, i due algoritmi hanno un comportamento diverso.

Un argomento rilevante: la maggior parte degli algoritmi di ordinamento non è stabile. Dicono due articoli sono "uguali", allora non è garantito che se Un stato posto prima Un ' nell'array originale, Un viene posizionato prima Un' nella matrice risultante.

+0

il risultato deve essere lo stesso. in base al post, l'arancione deve essere il primo per tutto –

+0

+1 per le fantastiche informazioni –

+1

Va bene, ma si noti che per i grandi array, gli elementi che sono "equivalenti" (ma non lo stesso, ad esempio un puntatore diverso) possono essere mischiato ... –

Problemi correlati