如何在数组数组中获取特定值

时间:2013-03-27 10:17:50

标签: ruby arrays multidimensional-array indexing

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

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 个答案:

答案 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