[英]Search array of symbols - 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"]
,而不是實際的數組索引。
使用Array#map
代替Array#each
:
buzz = bar.map{|i| foo.index(i.to_sym)}
#=> [1, 4]
一種有效的方法是,首先將foo
轉換為哈希值,特別是如果必須多次執行此操作(對於bar
不同值)或數組較大的情況:
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.size
和m=bar.size
,則在構造哈希之后僅需要m
哈希查找。 相比之下,對於bar
每個元素,平均而言,將進行n/2
比較,以找到與bar
的元素匹配的foo
元素的索引,總共進行m*n/2
比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.