【问题标题】:Search array of symbols - Ruby搜索符号数组 - Ruby
【发布时间】:2014-12-30 21:00:09
【问题描述】:

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

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

例如,如果您搜索“recorded_at”和“activity”,它应该返回[1,4]

我认为这样的事情会起作用:

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

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

【问题讨论】:

    标签: ruby arrays symbols


    【解决方案1】:

    一种有效的方法是首先将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.sizem=bar.size,则在构造散列后只需要m 散列查找。相比之下,对于bar 的每个元素,平均会有n/2 比较以找到与bar 的元素匹配的foo 元素的索引,总共m*n/2 比较.

    【讨论】:

      【解决方案2】:

      使用Array#map 代替Array#each

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

      【讨论】:

      • 你禅我柯亦雍仲文奈
      • 好德,我下词用拼音!
      猜你喜欢
      • 2015-04-11
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2013-11-26
      • 2012-06-04
      • 1970-01-01
      • 2015-05-12
      • 2012-03-18
      相关资源
      最近更新 更多