2010-11-03 51 views
4

我想找到一些优雅的方式来实现这一点。也许像下面这样:Ruby:如何过滤哈希结构以获得所有<>“1”的密钥?

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

任何更好的方法来实现这一目标?

+1

您是否想要键值为<>'1'的键值对,还是您想要键<>'1'中的所有键?如果你想要的键值对,我会使用散列hash.select/hash.reject,如果你想要的键,使用hash.keys.select/hash.keys.reject。 – 2010-11-03 18:05:31

回答

12

您可以使用 “阵列的区别”在选择无线因为它更具可读性,所以是否定的测试。 “在X =='1'为真的情况下拒绝值”与“在x!='1'为真的情况下收集值”。

+0

一分钟前我很惊讶,但它不仅更短,而且更快) – Nakilon 2010-11-03 21:04:27

+0

我还没有真正测量过,但我希望选择/拒绝速度更快。 :) – 2010-11-04 08:24:04

1

这里有一种方法:

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

选择返回一个散列,而不是散列的键。小的区别,但原来的问题要求钥匙。 – 2010-11-03 18:03:57

+0

好抓!谢谢你指出,杰森。 – 2010-11-03 19:45:26

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

我想拒绝:

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

希望这有助于

相关问题