Ruby:对于循环内部迭代导致数组填充"范围"一类物品

时间:2016-03-13 14:45:03

标签: arrays ruby loops for-loop iteration

有一个二维数组,由" 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的全零矩阵)

2 个答案:

答案 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}}