2011-12-20 14 views
26

Ho un Hash e mi hanno ordinato utilizzando i valoriCome ottenere i primi n elementi da Hash nel rubino?

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

Ora voglio solo per ottenere hash dei cinque elementi .. Un modo è quello di utilizzare un contatore e rompersi quando la sua 5. Qual è modo preferito di fare in rubino?

Grazie

risposta

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

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

a cura:

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

Non hai bisogno dello splat o "appiattisci", basta inserire l'AoA in "Hash []': 'Hash [h.sort_by {| k, v | -v} [0..1]] ' –

+0

grazie mu, modificato – maprihoda

0

Gli hash non sono ordinate per natura (anche pensato per l'attuazione di Ruby sono). Prova a convertire Hash in array e ne estrai [0,4]

+0

sei sicuro che siano in Ruby? 'sort_by' restituisce un array –

+1

Gli hash sono ordinati a partire da Ruby 1.9, ma in 1.8 non lo erano. – Linuxios

+0

@Oleg (Impossibile digitare il proprio nome su molti dispositivi, yanno) Sì, sono ordinati per ordine di inserimento a partire da 1.9. –

6

Nuovo a rubarmi (per favore sii gentile se ho torto ragazzi!) Ma funziona?

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

lavora per me a IRB, se ho capito quello che stai cercando di raggiungere correttamente

+2

Che funzionerà, ma il risultato è un array di matrici. '[[: Una, 1], [: B, 2]]'. L'hash viene convertito in un array e quindi il metodo 'first' viene utilizzato su quell'array –

+0

@dorsel yup corretto .. – harshit

+1

Ma è possibile trasformare di nuovo quell'array in un Hash avvolgendolo in' Hash [] ': 'Hash [@ friends_comment_count.sort_by {| k, v | -v} .prima 5] '. –

4

Non è possibile ordinare una Hash ed ecco perché sort_by NON ordina l'hash. Restituisce una matrice ordinata di array.

0

In Ruby 2.2.0 e versioni successive, Enumerable#max_by accetta un argomento intero facoltativo che consente di restituire un array anziché un solo elemento. Ciò significa che è possibile fare:

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

non puoi semplicemente fare qualcosa di simile:

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

Quindi se si voleva la prima 2:

p h.first(2).to_h 

Risultato:

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

Non è il modo più efficiente per farlo, in particolare con gli hash di grandi dimensioni, ma un bel e semplice trucco quando ne hai bisogno. – tristanm

Problemi correlati