2010-01-26 14 views
7

¿Cuál es la mejor manera de ordenar un Enumerable en orden descendente?Ordenar un enumerable en orden descendente

que he estado haciendo @array.sort.reverse o @array.sort_by{|song| song.title }.reverse

supongo que podría hacer algo como @array.sort{|a, b| b.title <=> a.title}, pero encuentro esto difícil de leer y detallado.

+3

Creo que 'array.sort.reverse' es bueno. Es simple y claro, y no debe ser muy caro. – Peter

+0

¿Por qué no usarías #reverse? – mikezter

+0

Dado que sort es 'O (n log n)' y reverse es solo 'O (n)', la solución de Peter es buena. –

Respuesta

5

El rendimiento de Array.reverse no es muy malo. Lo que le cuesta usar @array.sort.reverse es una duplicación de matriz adicional más la inversa (n/2 conmutadores de elemento). Entonces sí, creo que debería ser aceptable si crees que se lee con mayor claridad.

Consulte su source para más detalles. Y también, creo que usar @array.sort.reverse proporciona una legibilidad "ligeramente" mejor (pero no es muy difícil de leer de ninguna manera).

+1

sort.reverse no es mucho más lento que el género, y es mucho más rápido que cualquier cosa elegante. Analicé array.sort, array.sort.reverse y array.reverse_sort (mi solución de parche de mono, que he eliminado desde entonces como "una pieza obvia de basura") en 1,000,000 carrozas aleatorias y obtuve tiempos de 2.4, 2.5 y 24.8 segundos, respectivamente. –

3

no estoy seguro de si esto funciona mejor que Wayne Conrad 's se describe como 'pieza evidente de basura', pero se podría definir como 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 

Entonces llaman de la siguiente manera:

@songs.sort_by_descending(&:title) 
Cuestiones relacionadas