更改每个元素时,通过二维数组迭代



我想填充具有某些值的二维数组。我想得到:

[
  ['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

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)。当您在内array中修改元素时,您可以在每个数组上对其进行修改!

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

只是一个注释,构建Matrix很简单,因为它具有固有的行和列概念:

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

我认为矩阵类经常被忽略。在行,列,子膜等上操作的内置方法有时真的很方便。

只是出于好奇:

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

您也可以尝试

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

三元数字?

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

使用Eric和Sawa的答案以及repeated_permutation,我们有

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

最新更新