2014-11-04 67 views
1

给定一个符号数组,如何迭代数组,并存储匹配对的数组索引?搜索数组符号 - Ruby

foo = [:date, :recorded_at, :scheduled_for, :amount, :activity, :pending ] 

例如,如果你搜索“recorded_at”和“活动”,它应该返回[1,4]

我觉得像这样的工作:

bar = ['recorded_at','activity'] 
buzz = bar.each{|i| foo.index(i.to_sym)} 

然而,这只是返回字符串,["foo", "bar"],而不是实际的数组索引。

回答

4

使用Array#map,而不是Array#each

buzz = bar.map{|i| foo.index(i.to_sym)} 
#=> [1, 4] 
+0

这里的常客,发现牛人一枚,哈哈! – scottxu 2014-11-04 03:36:17

+0

ni zen me ke yi yong zhong wen ne – dddd1919 2014-11-04 03:42:50

+0

好的,我下载yong pinyin! – scottxu 2014-11-04 03:44:54

0

的有效方法,特别是如果你有这个多次做,为bar不同的值,或者如果数组很大,将先转换foo到哈希:

foo = [:date, :recorded_at, :scheduled_for, :amount, :activity, :pending ] 

foo_hash = Hash[foo.map(&:to_s).zip([*0...foo.size]).to_h] 
    #=> {"date"=>0, "recorded_at"=>1, "scheduled_for"=>2, 
    # "amount"=>3, "activity"=>4, "pending"=>5} 

然后,它是用于bar任何值的简单散列查询:

bar = ['recorded_at','activity'] 
foo_hash.values_at(*bar) 
    #=> [1, 4] 

对于Ruby 1.9+ Hash[arr]可以替换为arr.to_h

如果n=foo.sizem=bar.size,在构造散列之后将只需要m散列查找。通过对比,对于bar的每个元素,将平均比较来找出与bar的元素匹配的foo的元素的索引,总共为m*n/2比较。