【问题标题】:How to search within a two-dimensional array如何在二维数组中搜索
【发布时间】:2015-06-27 01:20:39
【问题描述】:

我正在尝试学习如何在二维数组中进行搜索;例如:

array = [[1,1], [1,2], [1,3], [2,1], [2,4], [2,5]]

我想知道如何在数组中搜索[1, y] 形式的数组,然后显示其他y 数字是什么:[1, 2, 3]

如果有人可以帮助我了解如何仅使用数字进行搜索(因为我发现的很多示例都包括字符串或哈希),甚至可以帮助我了解在哪里寻找合适的资源,那将很有帮助。

【问题讨论】:

  • 这部分不清楚:how to search only with numbers (as a lot of the examples I found include strings or hashes)。你能添加例子来说明你的意思吗?
  • 我得到提示,它可能类似于 array.each { |i| ... } 但不知道如何应用它...我很抱歉这样一个基本的问题。
  • @sawa 抱歉,我的意思是我希望能够搜索包含数字 1(在 [0] 位置)的数组并返回另一个配对数字。在这种情况下,我希望能够在整个数组中搜索第一个数字为 1 的内部数组。最后,我想找出有多少项目中的数字为 1第一个位置以及他们对应的合作伙伴编号是什么(1、2、3)。这是假设我首先看不到数组中的数字。
  • 这个意图很明确。不清楚的是我引用的部分。毕竟,您可能根本不需要提及。
  • @sawa 我明白了,好的,谢谢你的反馈,我可能问得不对,因为我对很多事情没有清楚的了解......

标签: ruby arrays search


【解决方案1】:

您可以使用Array#selectArray#map 方法:

array = [[1,1], [1,2], [1,3], [2,1], [2,4], [2,5]]
#=> [[1, 1], [1, 2], [1, 3], [2, 1], [2, 4], [2, 5]]
array.select { |el| el[0] == 1 }
#=> [[1, 1], [1, 2], [1, 3]]
array.select { |el| el[0] == 1 }.map {|el| el[1] }
#=> [1, 2, 3]

有关数组的更多方法,请探索docs

【讨论】:

  • 非常感谢!这是有道理的,我很欣赏这个链接。
  • 啊,我才知道你只能检查一个答案!?我最终检查的那个答案很清楚,它进一步分解了,这使我更容易理解这个答案。
  • @Kumo 我绝对同意你的选择,sawa 的回答包含了很好的解释。祝你学习 Ruby 好运!如果您有足够的声誉,您也可以为有用的答案投票(不记得确切应该是多少)
  • 你可以把map{|el| el[1]}写成map(&:last)
  • @CarySwoveland 我知道。我试图尽可能明确,因为 OP 刚刚开始学习该语言。 IMO Symbol#to_proc 不是初学者的东西 :)
【解决方案2】:

你可以使用each_with_object:

array.each_with_object([]) { |(x, y), a| a << y if x == 1 }
#=> [1, 2, 3]

【讨论】:

    【解决方案3】:

    做同样事情的另一种方法是将Array#mapArray#compact 一起使用。这样做的好处是只需要一个块和一个简单的操作,这使得它更容易理解。

    array.map { |a, b| a if b == 1 }
    #=> [1, 2, 3, nil, nil, nil]
    array.map { |a, b| a if b == 1 }.compact
    #=> [1, 2, 3]
    

    【讨论】:

    • 谢谢!阅读完以上内容后,这很好,很简洁。
    • 一个小问题,但这实际上是落后的 (array.map { |a,b| b if a==1 })。但是有一个问题:array = [[1,2],[1,nil]] #=&gt; [2],而=&gt; [2,nil] 是必需的。
    【解决方案4】:

    Ruby 允许您通过在块参数中使用括号来查看元素。 selectmap 只分配一个块参数,但您可以查看元素:

    array.select{|(x, y)| x == 1}
    # => [[1, 1], [1, 2], [1, 3]]
    
    array.select{|(x, y)| x == 1}.map{|(x, y)| y}
    # => [1, 2, 3]
    

    可以省略|...|之间对应整个表达式的括号:

    array.select{|x, y| x == 1}
    # => [[1, 1], [1, 2], [1, 3]]
    
    array.select{|x, y| x == 1}.map{|x, y| y}
    # => [1, 2, 3]
    

    作为一种编码风格,将未使用的变量标记为_是一种习惯:

    array.select{|x, _| x == 1}
    # => [[1, 1], [1, 2], [1, 3]]
    
    array.select{|x, _| x == 1}.map{|_, y| y}
    # => [1, 2, 3]
    

    【讨论】:

    • 感谢您为我分解,非常清楚! _ 也很高兴知道约定。
    【解决方案5】:

    如果您先选择然后映射,您可以使用 grep 函数将其全部集成到一个函数中:

    p array.grep ->x{x[0]==1}, &:last #=> [1,2,3]
    

    【讨论】:

      猜你喜欢
      • 2017-09-06
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 2016-09-12
      相关资源
      最近更新 更多