有一个二维数组,由" 0"填充。默认情况下。我想创建另一个数组,其中包含"非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的全零矩阵)
答案 0 :(得分:1)
map!
通过将每个值替换为提供的块计算结果来更新数组。重新分配块参数无效。
正如你所写的那样,块将评估为for
表达式求值的内容,这总是迭代的东西(在这种情况下是范围)
您需要做的就是更改它,以便块中的最后一行评估您想要的结果。
另外,您可以用
之类的内容替换块内容a + play_field[0..6].count {|b| b != "0}
很少需要迭代一系列整数作为迭代集合的方式。
答案 1 :(得分: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}}