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]} " } 

但我得到了同样的结果。请任何建议都非常感谢。我需要一个简单的解释。

4

5 回答 5

8

each_index是一个遍历所有索引并对每个索引执行操作的 Enumerable。完成后,它将返回您的原始收藏,因为更改它不是它的工作。如果你想通过puts/在屏幕上输出东西,printeach_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']在第二次迭代中,依此类推......

只是指出这一点,因为我不知道你想要做什么的目标是什么。

于 2013-03-27T10:36:19.207 回答
5

像这样做:

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

因为你想要索引 2 的字母,而不是 3。

数组也应该这样定义:

array = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
于 2013-03-27T10:22:40.783 回答
3

你可以map这样使用:

a = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
a.map(&:last)
# => ["c", "f", "i"]

或者,如果您真的想要 put 而不是收集的值:

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

Matrix如果你想做更多的 Matrix-y 东西,你也可以使用 Ruby 的类:

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,这将使您回到熟悉的领域,使用最后一列的值。

于 2013-03-27T12:47:10.167 回答
0

ruby 中的数组从 0 开始索引,而不是从 1 开始。所以:

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

应该给你你想要的。

于 2013-03-27T10:22:57.970 回答
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
于 2013-03-27T10:30:41.390 回答