我有一个数组(外部数组),它包含三个数组(内部数组),每个数组有三个元素。
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]} " }
,但我得到相同的结果。任何建议都非常感谢。我需要一个简单的解释
each_index
是一个Enumerable,它遍历所有索引并对每个索引执行操作。当它完成后,它将返回您的原始集合,因为它的工作不是更改它。如果你想通过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"]
数组。map遍历数组的元素,因此在每一步中|el|都是一个元素,而不是索引,如:第一次迭代['a', 'b', 'c']
,第二次迭代['d', 'e', 'f']
,以此类推…
我只是指出这一点,因为我不知道你想要做的目标是什么
这样做:
array.each_index{|i| puts "letter: #{array[i][2]} " }
因为你想让字母在索引2处,而不是3处
数组也应该这样定义:
array = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
你可以这样使用map
:
a = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
a.map(&:last)
# => ["c", "f", "i"]
或者如果您真的想要看跌而不是收集的值:
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
,这将使您回到熟悉的上一列值的领域。
ruby中的数组从0开始索引,而不是从1开始索引。所以:
array.each_index{|i| puts "letter: #{array[i][2]} " }
应该给你你想要的。
你也可以试试下面的方法:
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