2009-12-14 59 views
1

我试图填充数组基于散列值数组和散列的交集:Ruby Array交集,Hash.has_value?用于与阵列相交第[i + 1]基于散列值

为散列值的交叉点
array2 = ["hi","world","One"] 
VALS = {:one => "One", :two => "Two"} 
array2 = VALS.values & array2 
print array2 

工作正常,并array2[i],但如果我想用array2填充array2[i+1]元素,我会丢失。

也试过:

array2.select { |i| VALS.has_value? i ? array2[i+1] : nil } 

,但没有运气。

任何想法?

+0

固定标题,'Array#&'是十字路口,*不*按位&。 – akuhn 2009-12-14 10:16:34

回答

0
array = [] 
array2.each_with_index{|v,i| array << (VALS.has_value? i ? array2[i+1] : nil)} 
0

这听起来像你试图把你的数组当作一系列的内部键和值,或者把外部键转换成vals的倒数。所以你的例子的正确结果是:

{"hi" => "World", "One" => :one} 

是吗?如果是的话,在这里:

invertedvals = vals.invert 
Hash[*array2.map {|x| [x,invertedvals[x]]}.flatten.compact] 

如果不是,请说明是什么导致你试图产生...

0

这里是我结束了作为一个答案,以我自己的问题:

array1.each do |i| 
    puts "#"*5 + i + "#"*5 if !array2.include? i 
    if array2.include? i 
    result << i+":" << array2[array2.index(i)+1] 
    end 
end 

有没有更快的算法呢?希望使用:

array1 & array2 

也用于注入一点,基准显示其中任何一点之间的差别很小。