有一个二维数组,默认情况下用"0"填充。我想创建另一个数组,该数组保存每列的"non 0"项目数,因此,第二个数组的长度与二维数组的列数相同。
这是我遇到的代码,我用固定长度(2D 数组的列数)初始化了 1D 数组
column_depth=Array.new(8) {0}
遍历 2D 数组并针对每列的每个非 0 元素,我想增加 1D 数组中的相应值:
column_depth.map! do |a|
for i in 0..6
play_field[i].each do |b|
if b != "0"
a = a+1
end
end
end
end #outer map (column_depth)
但是,当我打印出column_depth数组的内容时,我得到以下结果:
0..6
0..6
0..6
0..6
0..6
0..6
0..6
0..6
我对这个输出完全感到困惑,为什么它可以将 for 循环的范围分配给值"a"? (测试输入为play_field的全零矩阵)
map!
通过将每个值替换为提供的块计算值的任何值来更新数组。重新赋值块参数不起作用。
当你写它时,块将计算为for
表达式计算的任何值,这始终是迭代的东西(在本例中为范围)
您需要做的就是更改它,以便块中的最后一行计算出您想要的结果。
作为旁白,您可以将块内容替换为类似的东西
a + play_field[0..6].count {|b| b != "0}
很少需要迭代一系列整数作为迭代集合的一种方式。
您不必创建数组然后对其进行修改。只
column_depth = play_field.map{|col| col.count{|n| n != 0}}
对于计算play_field
其他维度中的非零数,
row_depth = play_field.transpose.map{|row| row.count{|n| n != 0}}