while循环中的值不会修改外部值

时间:2014-11-30 01:12:16

标签: ruby arrays

我有一个很长的代码,但我试图尽可能少地复制和调整我的问题。我有一个方法,它创建一个0和1

的数组(2D)
array1 = newValue(2)  - the number 2 represents how many 1 the array has
array2 = newValue(3)

和这个循环

(0..9).each do|i|
(0..9).each do|j|
    while((array1[i][j] == array2[i][j]) && (array2[i][j] == 1))  do
      array1 = newvalue(2)
      array2 = newvalue(3)
  end
 end
end

我正在使用while循环,因此我不会在两个数组中的相同位置都有1。但是while循环内部的内容不会修改数组的值。我也尝试过使用地图!/收集!但我觉得我做错了什么,因为什么都没发生。我希望你能理解我的目的。

编辑:

def newValue(value)
value = value.to_i
array = Array.new(10)  { Array.new(10 , 0) }
(a lot of conditions on how to position the items in the array)
return array
end 

1 个答案:

答案 0 :(得分:0)

这是我的看法......希望它会帮助我们。看来你注意到的是真的。阵列没有重置。可能是因为在每个块内部,范围丢失了。这可能是因为是阵列。我采取了略微不同的方法。把所有东西放在一个类中,这样你就可以拥有你可以控制的实例变量,你知道它们在哪里,它们总是一样的。

我拿出compare_arrays函数,只返回匹配的坐标(如果有的话)。如果不是,则返回nil。然后,您在reprocess方法中简化了while循环。如果您找到匹配项,请重新处理,直到您不再匹配为止。我使用了一个虚拟的newValue方法,它只返回了另一个2d数组(正如你所建议的那样)。这似乎可以解释我所说的。给它一个旋转,看看你的想法。您可以使用processor.array1完成所有处理后访问这两个数组,如您在底部所做的那样。

# generate a random 2d array with 0's and val's
def generateRandomArray(val=1)
  array = []
  (0..9).each do |i|
    (0..9).each do |j|
      array[i] ||= []
      array[i][j] = (rand > 0.1) ? 0 : val
    end
  end 
  array
end

array1 = generateRandomArray
array2 = generateRandomArray

def newValue(val)
  generateRandomArray(val)
end

class Processor
  attr_reader :array1, :array2

  def initialize(array1, array2)
    @array1 = array1
    @array2 = array2
  end

  def compare_arrays
    found = false
    for ii in 0..9
      break unless for jj in 0..9
                     if ((@array2[ii][jj] == 1) && (@array1[ii][jj] == 1)) 
                       found = true
                       break
                     end
                   end
    end
    [ii,jj] if found
  end

  def reprocess
    while compare_arrays
      puts "Reprocessing"
      @array1 = newValue(2)
      @array2 = newValue(3)
      reprocess
    end
  end
end


processor = Processor.new(array1, array2)
processor.reprocess

puts processor.array1.inspect