2014-11-30 3 views
0

У меня есть длинный код, но я попытался скопировать и адаптировать мою проблему как можно меньше строк. У меня есть метод, который создает массив (2D) с 0 и 1Значения в цикле while не изменяют внешние значения

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 

Я использую время цикла, так что я выиграл т есть 1 в том же самом положении в обоих массивах. Но то, что находится внутри цикла while, не изменяет значения массива. Я также попытался использовать карту!/Collect! но я думаю, что я сделал что-то не так, потому что ничего не случилось. Надеюсь, вы поймете, что я пытаюсь сделать.

Edit:

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

Что такое метод 'newvalue'? Это просто попытка заполнить 2-й массив? Нам может помочь немного больше контекста. Похоже, вы, вероятно, хотите, чтобы эта внутренняя вещь больше напоминала «array1 [i] [j] = newvalue (2)» или что-то в этом роде, но поскольку я не уверен, что вы пытаетесь сделать, это трудно понять. –

+0

Вы хотите иметь это сделать 'array1 [i] = newValue (2)' и 'array2 [i] = newValue (3)'? Вероятно, проблема связана с тем, что вы пытаетесь назначить массив 1d (возврат из newValue) в массив 2d (array1 и array2). Кроме того, в вашем выражении while массив 'array2' никогда не будет равен' 1', если это фактически массив 2d - опять же, вы смешаете яблоки и апельсины, так сказать. –

+0

@mrrogers my while loops предполагается найти, если array1 и array2 имеют элемент со значением 1 позиции с точно такими же координатами. Если они это сделают, им будут присвоены новые значения. (Я изменил условие сейчас, я пропустил это, когда я написал программу здесь.) – Bogdan

ответ

0

Вот мое взятие ... надеюсь, это будет помогать. Кажется, что вы заметили, это правда. Массивы не сбрасываются. Вероятно, потому что внутри каждого блока область видимости теряется. Вероятно, это потому, что это массивы. Я принял несколько иной подход. Поместите все в класс, чтобы вы могли иметь переменные экземпляра, которые вы можете контролировать, и знаете, где они находятся, и что они всегда одинаковы.

Я вытащил функцию compare_arrays, которая просто возвращает координаты совпадения, если таковой имеется. Если он не возвращает nil. Затем цикл youre while упрощен в методе reprocess. Если вы нашли совпадение, переработайте, пока у вас больше нет матча. Я использовал метод dummy 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 
+0

Я пробовал это, но ничего не происходит .. Я думаю, вы использовали другой метод для назначения значений массивам, потому что я не могу использовать эту часть в моем процессоре = Processor.new (array1, array2) – Bogdan

+0

Я обновил сообщение, чтобы включить мой версии генерации 2d-массива, которая также используется для моего поддельного метода 'newValue'. Есть ли способ опубликовать метод newValue более подробно? Может быть, проблема внутри? –

+0

Я нашел другой способ: d. У меня слишком много массивов для этого метода для обработки – Bogdan

Смежные вопросы