搜索符号数组 - Ruby

时间:2014-11-04 03:22:19

标签: ruby arrays symbols

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

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"],而不是实际的数组索引。

2 个答案:

答案 0 :(得分:4)

使用Array#map代替Array#each

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

答案 1 :(得分: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的每个元素,平均会有n/2个比较来查找与foo的元素匹配的bar元素的索引,共计m*n/2次比较。