如何在一个数组的数组中获取特定的值

4

我有一个包含三个数组(内部数组)的数组(外部数组),每个内部数组都有三个元素。

array = [[a, b, c], [d, e, f], [g, h, i]]

我想通过外部数组的索引选择特定的内部数组,然后根据其索引选择所选内部数组中的值。这是我尝试过的代码:
array.each_index{|i| puts "letter: #{array[i[3]]} " } 

我希望你能为我提供以下输出结果。
letter: c letter: f letter: i

但是,实际上我得到的是:
letter: [[a, b, c], [d, e, f], [g, h, i]]

我也尝试过。
array.each_index{|i| puts "letter: #{array[i][3]} " } 

但是我得到了相同的结果。请提供任何建议,非常感谢。我需要一个简单的解释。

5个回答

8
each_index是一个可枚举对象,它遍历所有索引,并对每个索引执行操作。完成后,它将返回你的原始集合,因为它的工作不是改变它。如果你想通过puts/print在屏幕上输出东西,那么使用each_index就可以了。
如果你想创建一个新的集合作为原始集合中所有元素的结果,你应该使用map
例如:
array = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
new_array = array.map {|el| el[2]}
=> ["c", "f", "i"]

array.map函数遍历数组的元素,因此每一步迭代中|el|都是一个元素,而不是索引。例如:第一次迭代中是['a', 'b', 'c'],第二次迭代中是['d', 'e', 'f'],以此类推...

我只是想指出这一点,因为我不知道你尝试做什么。


5

像这样做:

array.each_index{|i| puts "letter: #{array[i][2]} " } 

由于你需要的是索引为2而不是3的字符,因此应该这样定义数组:

同时,数组应该像这样定义:

array = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]

我实际上想放2而不是3,那是我的笔误...我正在处理的实际代码中有52个数组在主数组内(它是一副牌,所以索引为0-51)。我匆忙地试图为这篇文章简化它。 - kingweaver88

3
您可以这样使用map
a = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
a.map(&:last)
# => ["c", "f", "i"]

或者如果你真的想要puts而不是收集到的值:

a.each {|v| puts "letter: #{v.last}"}

你还可以使用Ruby的Matrix类,如果你想要进行更多矩阵相关的操作:
require 'matrix'
m = Matrix[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
last_column = m.column_vectors.last
# => Vector["c", "f", "i"]

现在你可以在 last_column 上使用任何 Vector 方法,包括 to_a,它将把你带回到上一个列的值的熟悉领域。


0

Ruby中的数组索引从0开始,而不是从1开始。因此:

array.each_index{|i| puts "letter: #{array[i][2]} " }

应该能够给你想要的东西。


再次声明,那是我的笔误,我的实际代码索引是0-51,所以我在写问题时有点匆忙。你写的东西是我最初认为会起作用的,我的意思是它很有道理,但出于某种原因它就是不起作用。 - kingweaver88

0
你也可以尝试以下方法:
p RUBY_VERSION

arr = [[1,2,3],[4,5,6],[11,12,13]]

arr.each{|x| p x; x.each_index{|i| p "Digit :: #{x[i]}" if i == 2} }

输出:

"2.0.0"
[1, 2, 3]
"Digit :: 3"
[4, 5, 6]
"Digit :: 6"
[11, 12, 13]
"Digit :: 13

啊,这就是我一直在寻找的东西,不知道为什么我没有想到嵌套循环。但是这很有道理,因为你有一个嵌套数组,为什么不嵌套循环呢...太好了。虽然我也喜欢其他建议,因为在某个时候我需要修改数组而不仅仅是打印它。但这回答了我的最初问题。谢谢! - kingweaver88

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