如何在二维数组中进行搜索

7

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

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

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

如果有人能帮助我理解如何仅搜索数字(因为我找到的许多示例包括字符串或哈希),甚至在哪里寻找正确的资源,那将非常有帮助。


这部分不太清楚:“如何仅使用数字进行搜索(因为我找到的许多示例包括字符串或哈希)”。您能添加示例以说明您的意思吗? - sawa
我得到的线索是它会像array.each {|i| ...}这样,但不知道如何应用它...对于这样一个基础的问题感到抱歉。 - Kumo
@sawa 抱歉,我的意思是我想搜索包含数字1(位于[0]位置)的数组,并返回其他配对的数字。在这种情况下,我想能够搜索整个数组,查找具有第一个数字为1的内部数组。最后,我想找出有多少个项目在第一位置上有数字1以及它们相应的伴随数字是什么(1、2、3)。这是假设我不能事先看到数组中的数字。 - Kumo
那个意图很明确。不清楚的是我引用的那部分。毕竟,你可能根本不需要提到那个。 - sawa
@sawa 我明白了,好的,感谢您的反馈。可能是因为我对很多事情没有清楚的理解,所以我的提问不太恰当。 - Kumo
5个回答

10

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]

感谢您为我解释得很清楚!此外,了解“_”作为约定也很好。 - Kumo

6
你可以使用 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]

要了解更多关于数组的方法,请浏览文档


非常感谢!这很有道理,我很感激提供链接。 - Kumo
啊,我刚刚才知道你只能检查一个答案吗!?这个答案很清楚,但我最终检查的那个更详细地解释了它,这让我更容易理解。 - Kumo
@Kumo 我完全同意你的选择,sawa的回答包含了很好的解释。祝你学习Ruby顺利!如果你有足够的声望,也可以给有帮助的答案点赞(不记得具体需要多少声望)。 - Andrey Deineko
你可以将 map{|el| el[1]} 写成 map(&:last) - Cary Swoveland
@CarySwoveland 我知道。我试图尽可能明确,因为OP刚开始学习这门语言。在我看来,Symbol#to_proc不是初学者的东西 :) - Andrey Deineko

5
如果你先选择然后再映射,你可以使用grep函数来在一个函数中完成所有操作。
p array.grep ->x{x[0]==1}, &:last #=> [1,2,3]

1
另一种实现相同功能的方法是将 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]

谢谢!在我阅读上面的内容后,这很好、整洁并且有意义。 - Kumo
一个小问题,但实际上这是反过来的(array.map { |a,b| b if a==1 })。然而,有一个问题:array = [[1,2],[1,nil]] #=> [2],而需要的是=> [2,nil] - Cary Swoveland

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接