在更改每个元素时迭代二维数组

时间:2017-12-06 08:34:18

标签: arrays ruby

我想用某些值填充二维数组。我想得到:

[
  ['Num00', 'Num01', 'Num02'],
  ['Num10', 'Num11', 'Num12'],
  ['Num20', 'Num21', 'Num22']
]

我该怎么做?

这是我的代码:

game_field = Array.new(3, Array.new(3))
3.times do |i|
  3.times do |j|
    game_field[i][j] = 'Num' + i.to_s + j.to_s
  end
end
game_field

7 个答案:

答案 0 :(得分:6)

Array.new接受一个块,您可以在其中直接定义元素:

Array.new(3){|i| Array.new(3){|j| "Num#{i}#{j}" } }
# [["Num00", "Num01", "Num02"], ["Num10", "Num11", "Num12"], ["Num20", "Num21", "Num22"]]

当您致电Array.new(3, Array.new(3))时,您创建的数组包含完全相同对象的3倍:Array.new(3)。修改内部数组中的元素时,可以在每个数组上修改它!

如果您这样初始化game_fieldgame_field = Array.new(3){ Array.new(3) },您的代码就可以正常使用。

答案 1 :(得分:2)

出于好奇:

([(?0..?2)] * 2).
  map(&:to_a).
  reduce(:product).
  each_slice(3).
  map { |e| e.map(&:join).map(&'Num'.method(:+)) }

答案 2 :(得分:2)

请注意,构建Matrix很简单,因为它具有行和列的固有概念:

Matrix.build(3){|i,j| "Num#{i}#{j}"}

我认为Matrix课程经常被忽视。对行,列,子矩阵等进行操作的内置方法有时非常方便。

答案 3 :(得分:1)

9.times.map{|i| "Num#{i.divmod(3).join}"}.each_slice(3).to_a

答案 4 :(得分:1)

您也可以尝试

game_field = (0..2).map do |i|
  (0..2).map do |j|
    "Num#{i}#{j}"
  end
end

一个班轮

game_field = (0..2).map {|i| (0..2).map {|j|  "Num#{i}#{j}"} }

答案 5 :(得分:1)

三元数?

(0...9).map{|n| "Num#{n.to_s(3).rjust(2,"0")}"}.each_slice(3).to_a

答案 6 :(得分:0)

好好使用Eric和Sawa的回答以及我们的repeated_permutation

[0,1,2].repeated_permutation(2)
       .map { |a, b| "Num#{a}#{b}" }
       .each_slice(3).to_a