Ruby - 如何访问多维数组中的元素

时间:2014-11-13 07:25:41

标签: ruby arrays multidimensional-array

我认为这很简单,但是当我遇到这种情况时,我无法做到这一点。我觉得如果我能理解这一点,我会更好地理解Ruby。

WHAT :我想在2-d字符串和整数数组中搜索,并返回找到某个字符串的索引/索引。每个子阵列的这些索引也将按照相应子阵列的顺序放在一个数组中。

搜索字符串" a":

时的示例

输入数组: [[1," a"," a",3],[1,&# 34; b"],["",2]]

输出数组: [[1,2],[],[0]]

我做了什么: 直觉上我认为它会是这样的:

source = [[1,"a","a",3],[1,"b"],["a",2]]

source.each.each_index.select { |v| v == "a" }

source.each {|x| x.each_index.select { |i| x[i] == "a" }}

问题

1)我应该调用什么来从输入数组中获取输出数组?

2)我看到很多其他的调查员和方法以这种方式混合在一起,为什么我不能在这种情况下做到这一点?我不想用我尝试的一些更简单的测试用例来混淆这个问题,但是我得到了未定义的方法错误,或者只是返回我的源数组。

3)是否与哪些块与哪些方法相关?我在问题的答案之后对我的代码进行了建模:Find indices of elements that match a given condition我很困惑为什么看起来这个块直接与多个方法相关联。换句话说,| i |来自#each_index,而布尔值是#select。现在似乎是随机和杂乱的,如何构造这些块(即为什么反之亦然?)。

1 个答案:

答案 0 :(得分:1)

source.map { |row| row.each_index.select { |i| row[i] == "a" } }
# => [[1, 2], [], [0]]
  1. 你不能这样做,因为你的逻辑错了:) source.each {...}会返回source,无论你在街区内做什么都没关系。要返回结果,请使用mapsource.each.each_indexeach_index返回的枚举器上调用each而没有阻止,这不是枚举器上可用的方法(您希望数组上有each_index)。

  2. 事实上。带有阻止的each和没有阻止的each将会做很多不同的事情。

  3. 具体来说,在我上面的代码中:

    source数组开始。 map with block将处理每个元素的块(称为row),并返回结果数组。对于每一行,row.each_index没有块将返回row数组的所有索引的迭代器,select在迭代器上使用块将返回一个仅包含其中一些元素的数组。