【问题标题】:Ruby - How to access elements in a multi-dimensional arrayRuby - 如何访问多维数组中的元素
【发布时间】:2014-11-13 07:25:40
【问题描述】:

我认为这很简单,但是当涉及到这个案例时,我无法做到。我觉得如果我能理解这一点,我会对 Ruby 有更好的理解。

什么:我想在字符串和整数的二维数组中搜索,并返回找到某个字符串的索引/索引。每个子数组的这些索引也将按照相应子数组的顺序放置在一个数组中。

搜索字符串“a”时的示例:

输入数组: [[1,"a","a",3],[1,"b"],["a",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。现在对我来说似乎是随机且杂乱无章的,如何构建这些块(即为什么不反过来呢?)。

【问题讨论】:

    标签: ruby arrays multidimensional-array


    【解决方案1】:
    source.map { |row| row.each_index.select { |i| row[i] == "a" } }
    # => [[1, 2], [], [0]]
    
    1. 你不能这样做,因为你的逻辑是错误的 :) source.each {...} 将返回 source,不管你在块内做什么。要返回结果,请使用mapsource.each.each_indexeach 返回的枚举器上调用each_index 而没有阻塞,这不是枚举器上可用的方法(您希望each_index 在数组上使用)。

    2. 确实如此。 each with block 和 each without block 会做非常不同的事情。

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

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

    【讨论】:

    • 谢谢!哦,所以你说“source.each {...} 将返回源”,是不是即使里面的方法正在返回东西(例如#select),它也会返回最外面的(最近解释的代码)方法在这种情况下是 #each ,它只返回外部数组(这就是我得到的)。但是,看起来即使 #each 会返回自身,我仍然可以通过调用 source.each {|x| 打印出 [1, 2], [], [0] 结果p x.each_index.select { |i| x[i] == "a" }},只是它不会返回它。
    • 另外,由于 #each 可以在枚举器(本身)上使用,看起来我也可以选择调用 .each.each 并解析以定义我想要的数组,但它可能会与您的解决方案相比,它非常冗长且效率低下。
    猜你喜欢
    • 2023-03-11
    • 2015-07-05
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 2020-04-08
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多