我有一个很长的代码,但我试图尽可能少地复制和调整我的问题。我有一个方法,它创建一个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
答案 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