2009-12-14 23 views
0

我有一个Ruby散列相匹配:填充红宝石数组1与数组2字符串元素,当且仅当数组2元哈希值(不是键)

VALS = { :one => "One", :two => "Two" } 

和阵列:

array2 = ["hello", "world", "One"] 

问题:如何我可以填充一个新的array1,这样它只能拉入与VALS中的值完全匹配的array2中的任何值?

例如,我曾尝试:

array2.each_with_index do |e,i| 
array1 << e if VALS[i] ~= e 
end 

随着其他的事情,并没有工作。菜鸟。

感谢


辉煌!但当我尝试:

p array.select { |i| hash.has_value? i ? array[i+1] : "foo"} 

我得到了一个无法转换fixnum错误。我肯定错过了什么。

回答

6

如果两个集合都很大,那么使用嵌套循环会非常缓慢。这是更好地把内容作为集:

array1 = VALS.values & array2 
print array1 

输出:

One 
+0

不知道&操作符作为数组的集合交集。每天学习一些新东西:) +1 – 2009-12-14 05:44:00

+0

嗯......不需要'设置'的作品..永远不会想到! 但如果我想获得匹配第i个元素的数组的第i + 1个元素,怎么样? – Eric 2009-12-14 05:44:28

0

这里有一个选项:

hash = { :one => "One", :two => "Two" } 
array = ["hello", "world", "One"] 

p array.select { |i| hash.has_value? i } 
# >> ["One"] 
+0

谢谢!我将如何选择每场比赛的i + 1值? – Eric 2009-12-14 05:46:40

+0

我不会推荐'i'作为代表数组成员的块参数。我只会用它来表示一个索引号。 – 2011-10-14 02:09:09

0

得到它!

array.select do |i| 
    if VALS.has_value? i 
    result << array[array.index(i)+1] 
    end 
end