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