我有一个数组(外部数组),包含三个数组(内部数组),每个数组都有三个元素。
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]} " }
但我得到了相同的结果。请任何建议非常感谢。我需要一个简单的解释。
答案 0 :(得分:6)
each_index
是一个Enumerable,它遍历所有索引并对每个索引执行操作。完成后,它将返回原始集合,因为更改它不是它的工作。如果您想通过puts
/ print
在屏幕上输出内容,那么each_index
就可以了。
如果要通过浏览原始集合的所有元素来创建新集合,则应使用map。
e.g。
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']
,依此类推......
指出这一点,因为我不知道你要做的目标是什么。
答案 1 :(得分:5)
这样做:
array.each_index{|i| puts "letter: #{array[i][2]} " }
因为您希望在索引2处写字母,而不是3。
此外,数组应该像这样定义:
array = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
答案 2 :(得分:3)
你可以这样使用map
:
a = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
a.map(&:last)
# => ["c", "f", "i"]
或者如果你真的想要看跌期权而不是收集的价值:
a.each {|v| puts "letter: #{v.last}"}
如果你想要做更多Matrix-y的话,你也可以使用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"]
您现在可以使用Vector
上的任何last_column
方法,包括to_a
,这将使您回到熟悉的领域,并使用最后一列的值。
答案 3 :(得分:0)
ruby中的数组从0开始索引,而不是从1索引。所以:
array.each_index{|i| puts "letter: #{array[i][2]} " }
应该给你你想要的东西。
答案 4 :(得分: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