Ruby on rails Ruby 1.9-从2D数组中选择元素

Ruby on rails Ruby 1.9-从2D数组中选择元素,ruby-on-rails,ruby,arrays,Ruby On Rails,Ruby,Arrays,假设我有以下2D数组 sample = [["Tom",1],["Jerry",2]] 我想从阵列中取“杰瑞”。 目前我正在使用 sample.select{|i| i if i[1] == 2}[0][0] 我也试过了 sample.select{|i| i if i[1] == 2}.first.first # Returns "Jerry" - OK sample.select{|i| i[0] if i[1] == 2} # Returns ["Jerry",2]

假设我有以下2D数组

sample  = [["Tom",1],["Jerry",2]]
我想从阵列中取“杰瑞”。 目前我正在使用

sample.select{|i| i if i[1] == 2}[0][0]
我也试过了

sample.select{|i| i if i[1] == 2}.first.first # Returns "Jerry" - OK
sample.select{|i| i[0] if i[1] == 2}          # Returns ["Jerry",2] - NOT OK

如果有更好的方法获取元素,请提供帮助。

如果要获取所有名称,可以尝试以下方法:

sample.collect(&:first)
# => ["Tom", "Jerry"]
sample.first.first
# => "Tom"
但是,正如在您的问题中,您只需要第一个元素的名称,您可以尝试以下方法:

sample.collect(&:first)
# => ["Tom", "Jerry"]
sample.first.first
# => "Tom"
如果您的搜索依赖于名称“Tom”,则:

根据第二个元素的值返回名称:

sample.detect{|i| i[1] == 1}.first
# => "Tom"
用于扁平化输入
示例

> sample  = [["Tom",1],["Jerry",2]]
> sample.flatten.find { |name| name == 'Tom' }
=> "Tom"
根据OP的意见更新:

> sample.find { |name, id| id == 1 }.first
=> "Tom"

这也应该对你有用

sample.flatten.first 

现在您可以(给定键的条件,即第一个元素是唯一的,如果值重复,那么第一个键将是匹配值的输出)-

  • 用于Ruby 1.9或更高版本:

    sample_hash.key(1)#=>“Tom”

  • 用于Ruby 1.8:

    sample_hash.index(1)#=>“Tom”


  • 最好的方法是使用散列,但如果您想将其保留为列表,请查看函数
    rassoc

    sample  = [["Tom",1],["Jerry",2]]
    
    p sample.rassoc(2) #=> ["Jerry",2]
    p sample.rassoc(2).first #=> "Jerry"
    
    jerry_item,_ = sample.rassoc(2)
    p jerry_item => "Jerry"
    
    如果有更好的方法获取元素,请提供帮助

    可以写为:

    sample.select { |i| i[1] == 2 }
    #=> [["Jerry", 2]]
    
    请注意,返回一个数组。要查找第一个元素,请使用:

    您仍然必须先调用
    [0]
    。才能获得
    “Jerry”
    。对结构化数据使用(或自定义类)可能更简洁:

    sample = [{name: 'Tom', id: 1}, {name: 'Jerry', id: 2}]
    sample.find { |h| h[:id] == 2 }[:name]
    #=> "Jerry"
    
    另一个选项是使用另一个散列按对象的
    id
    属性存储这些对象:

    sample_by_id = sample.map { |h| [h[:id], h] }.to_h
    #=> {1=>{:name=>"Tom", :id=>1}, 2=>{:name=>"Jerry", :id=>2}}
    sample_by_id[1][:name]
    #=> "Jerry"
    

    谢谢然而,如果我想要杰瑞,这两种方法都不能解决我的问题。@ramya我为namewise seach做了编辑。请查收。一开始我并没有像你提到的那样做,只是为了找到汤姆。谢谢。我希望Tom基于[“Tom”,1]的第二个元素,如果I==1,则类似于返回“Tom”。请重新阅读我编辑的问题。@ramya我已经相应地编辑了它。希望能有帮助:)它有效。谢谢:)。我正在寻找更好的方法。请参考最后的答案。谢谢。我要求再次阅读我的问题。它是2D数组,在[“Tom”,1]中,我想根据1检索Tom。您给出的解决方案是1D阵列。非常感谢。它是有效的:)。我知道在散列中搜索时时间复杂度为O(1)。关于空间复杂度,是否可以将2D数组转换为散列,然后选择??如果示例中有第三个元素:
    [“Tom”,3]
    ,并且您希望用“3”查找此“Tom”,则此操作将失败。调用
    Hash[sample]
    时,可能会由于重复的键而丢失一些数据。如果您的输入数据具有唯一的键,那么这是一个完美的解决方案!如果您查看
    key(value
    如何实现的源代码,它循环并运行散列的每个元素(key-value对)。这与执行
    find
    /
    detect
    (但由于该方法是用C编写的,因此速度更快)在数组上,然后获取结果的第一个元素。@vee:你说得对。在注释中添加了这个。谢谢。我不明白。如果你知道
    示例
    包含一对
    [“Jerry”,x]
    ,提取
    “Jerry”
    是没有意义的。如果你想知道是否有第一个元素是
    “Jerry”的对
    ,你可以使用
    sample.map(&:first).include?(“Jerry”)
    。如果你想提取一对第一个元素是
    “Jerry”
    ,如果有一个,
    ,那么sample.find{s,| s==“Jerry”}
    。是哪一对?请澄清你的问题。
    sample.find { |i| i[1] == 2 }
    #=> ["Jerry", 2]
    
    sample = [{name: 'Tom', id: 1}, {name: 'Jerry', id: 2}]
    sample.find { |h| h[:id] == 2 }[:name]
    #=> "Jerry"
    
    sample_by_id = sample.map { |h| [h[:id], h] }.to_h
    #=> {1=>{:name=>"Tom", :id=>1}, 2=>{:name=>"Jerry", :id=>2}}
    sample_by_id[1][:name]
    #=> "Jerry"