2015-04-15 2 views
0

Я пытаюсь транспонировать [[0, 1, 2], [3, 4, 5], [6, 7, 8]]. Я получаю [[2, 5, 8], [2, 5, 8], [2, 5, 8]].Назначение значений для 2D-массива с использованием метода «каждый»

Я вижу, что происходит с линией p transposed_arr, но не понимаю, почему это происходит. На каждой итерации она меняет каждую строку, а не только одну.

def my_transpose(arr) 
    # number of rows 
    m = arr.count 

    #number of columns 
    n = arr[0].count 

    transposed_arr = Array.new(n, Array.new(m)) 

    # loop through the rows 
    arr.each_with_index do |row, index1| 

     # loop through the colons of one row 
     row.each_with_index do |num, index2| 

      # swap indexes to transpose the initial array 
      transposed_arr[index2][index1] = num 
      p transposed_arr 
     end 
    end 
    transposed_arr 
end 
+0

Thx Кэри, он работает ... –

+0

Теперь, когда ваш код работает, рассмотрите postin g в [Обзор кода] (http://codereview.stackexchange.com/), чтобы получить предложения по улучшению. Если вы еще не были там, я думаю, что вы будете впечатлены предоставленным там советом. Многие из вопросов, размещенных там от новичков, так что это нисколько не пугает. –

ответ

3

Вам нужно сделать только одно изменение, и ваш метод будет работать нормально. Заменить:

transposed_arr = Array.new(n, Array.new(m)) 

с:

transposed_arr = Array.new(n) { Array.new(m) } 

Прежние марки transposed_arr[i] один и тот же объект (массив размера m) для всех i. Последнее создает отдельный массив размером m для каждого i

Случай 1:

transposed_arr = Array.new(2, Array.new(2)) 
transposed_arr[0].object_id 
    #=> 70235487747860 
transposed_arr[1].object_id 
    #=> 70235487747860 

Случай 2:

transposed_arr = Array.new(2) { Array.new(2) } 
transposed_arr[0].object_id 
    #=> 70235478805680 
transposed_arr[1].object_id 
    #=> 70235478805660 

При том, что изменить метод возвращает:

[[0, 1, 2], 
[3, 4, 5], 
[6, 7, 8]] 
Смежные вопросы