2010-01-26 4 views
7

Qual è il modo migliore per ordinare uno Enumerable in ordine decrescente?Ordinare una numerazione in ordine discendente

Ho fatto @array.sort.reverse o @array.sort_by{|song| song.title }.reverse

Suppongo che avrei potuto fare qualcosa di simile @array.sort{|a, b| b.title <=> a.title}, ma trovo questo difficile da leggere e prolisso.

+3

Penso che 'array.sort.reverse' sia buono. È semplice e chiaro e non dovrebbe essere molto costoso. – Peter

+0

Perché non useresti #reverse? – mikezter

+0

Poiché l'ordinamento è 'O (n log n)' e l'inverso è semplicemente 'O (n)', la soluzione di Peter è buona. –

risposta

5

La prestazione di Array.reverse non è molto male. Ciò che ti costa usando @array.sort.reverse è una duplicazione di array extra più il contrario (n/2 switch di elementi). Quindi sì, penso che dovrebbe essere accettabile se pensi che sia più chiaro.

Vedere il suo source per dettagli. Inoltre, penso che l'uso di @array.sort.reverse fornisca una leggibilità "leggermente" migliore (ma non è molto difficile da leggere in alcun modo).

+1

sort.reverse non è molto più lento di sort, ed è molto più veloce di qualsiasi altra fantasia. Ho confrontato array.sort, array.sort.reverse e array.reverse_sort (la mia soluzione patch-scimmia, che da allora ho cancellato come "un ovvio pezzo di spazzatura") su 1.000.000 flottanti casuali e ha ottenuto tempi di 2.4, 2.5 e 24,8 secondi, rispettivamente. –

3

io non sono sicuro se questo funziona meglio di Wayne Conrad s' autodefinisce 'ovvio pezzo di spazzatura', ma si potrebbe definire come Enumerable#sort_by_descending

Enumerable.class_eval do 
    def sort_by_descending(&block) 
    sort { |a, b| block.bind(b).call <=> block.bind(a).call } 
    end 
end 

quindi chiamare come segue:

@songs.sort_by_descending(&:title)