2011-12-20 29 views
26

Tengo un hash y me han ordenado que el uso de los valores¿Cómo obtener los primeros n elementos de Hash en ruby?

@friends_comment_count.sort_by{|k,v| -v} 

Ahora sólo quiero llegar de hash de los cinco elementos .. Una forma es utilizar un contador y romper cuando su 5. ¿Cuál es forma preferida de hacer en ruby?

Gracias

Respuesta

28
h = { 'a' => 10, 'b' => 20, 'c' => 30 } 

# get the first two 
p Hash[*h.sort_by { |k,v| -v }[0..1].flatten] 

editado:

# get the first two (more concisely) 
p Hash[h.sort_by { |k,v| -v }[0..1]] 
+2

No necesita el splat o 'aplanar', solo alimente el AoA a' Hash [] ':' Hash [h.sort_by {| k, v | -v} [0..1]] ' –

+0

gracias mu, editado – maprihoda

0

hashes no están clasificadas por la naturaleza (incluso pensó en la implementación de Ruby que son). Intenta convertir tu Hash en matriz y obtén [0,4]

+0

¿estás seguro de que están en Ruby? 'sort_by' devuelve una matriz –

+1

Los hash se ordenan a partir de Ruby 1.9, pero en 1.8 no lo eran. – Linuxios

+0

@Oleg (No se puede escribir su nombre en muchos dispositivos, yanno) Sí, se ordenan por orden de inserción a partir de 1.9. –

6

Nuevo en ruby ​​(¡sé agradable si me equivoco chicos!) Pero ¿funciona?

@friends_comment_count.sort_by{|k,v| -v}.first 5 

funciona para mí en el IRB, si he entendido lo que estamos tratando de lograr correctamente

+2

Eso funcionará, pero el resultado es una matriz de matrices. '[[: a, 1], [: b, 2]]'. El hash se convierte en una matriz y luego se usa el método 'first' en esa matriz –

+0

@dorsel yup correct .. – harshit

+1

Pero puede convertir esa matriz de matrices en una Hash envolviéndola en' Hash [] 'así: 'Hash [@ friends_comment_count.sort_by {| k, v | -v} .primero 5] '. –

4

No se puede ordenar una Hash y por eso sort_by NO ordena su Hash. Devuelve una matriz ordenada de matrices.

0

En Ruby 2.2.0 y posterior, Enumerable#max_by toma un argumento entero opcional que hace que devuelva una matriz en lugar de solo un elemento. Esto significa que puede hacer:

h = { 'a' => 10, 'b' => 20, 'c' => 30 } 
n = 2 
p h.max_by(n, &:last).to_h # => {"b"=>20, "c"=>30} 
13

no puedes hacer algo como:

h = {"test"=>"1", "test2"=>"2", "test3"=>"3"} 

Entonces si quería la primera 2:

p h.first(2).to_h 

Resultado:

=> {"test"=>"1", "test2"=>"2"} 
+0

No es la forma más eficiente de hacerlo, especialmente con hashes grandes, pero un hack agradable y simple cuando lo necesita. – tristanm

Cuestiones relacionadas