2010-11-03 5 views
4

Je veux trouver un moyen élégant d'y parvenir. Peut-être comme follwing:Ruby: Comment filtrer dans une structure de hachage pour obtenir toutes les clés qui sont <> "1"?

hash={"1"=>"1","2"=>"2"} 
r=[] 
hash.each do |k,v| 
    if k!="1" 
     r<<k 
    end 
end 
puts r 

Une meilleure façon d'y parvenir?

+1

Voulez-vous les paires de valeur de clé où la clé est <> '1', ou voulez-vous toutes les clés où la touche <> '1'. Si vous voulez les paires de valeurs clés, j'utiliserais hash.select/hash.reject sur le hachage, si vous voulez les clés, utilisez hash.keys.select/hash.keys.reject. –

Répondre

12

Vous pouvez utiliser la "différence de tableau":

hash.keys - ['1'] 
#=> ["2"] 
+0

J'ai été surpris il y a une minute, mais ce n'est pas seulement plus court, mais encore plus rapide) – Nakilon

+0

Je n'ai pas vraiment mesuré, mais je m'attendrais à ce que select/reject soit aussi plus rapide. :) –

1

est ici une façon:

r = hash.select { |k,v,| k != "1" } 
puts r 

Hope this helps,
Ben

+0

Select renvoie un hachage, pas les clés du hachage. Petite distinction, mais la question initiale a demandé les clés. –

+0

Bonne prise! Merci d'avoir signalé cela, Jason. –

3
puts r = hash.keys.select { |i| i != "1" } 
0
hash.reject{|k,v| k == "1"} 

J'aime rejeter sur sélectionner wi un test négatif parce que c'est plus lisible. "Rejeter les valeurs où X == '1' est vrai" versus "collecter des valeurs où x! = '1' est vrai".

Questions connexes