我想填充具有某些值的二维数组。我想得到:
[
['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_field
:game_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