2013-10-11 3 views
2

Это может показаться домашней проблемой, но я клянусь, что это не так.Отображение массива 1D на 2D-массив

Я пытаюсь создать итератор для этого класса оболочки 2D-массива. Я подумал, что если я смогу решить эту проблему, тогда я смогу создать свой итератор.

Я это 1D массив из 9 последовательных целых чисел, начиная с 0 и заканчивая 8.

[0, 1, 2, 3, 4, 5, 6, 7, 8]

Я дал две переменные horizontal_size = 3 и vertical_size = 3

Я хочу, чтобы этот массив в 2D-массив, который равен horizontal_size по vertical_size. назовем их h и v для краткости.

Результат, который я хочу, чтобы генерировать это:

0 1 2 
3 4 5 
6 7 8 

Учитывая значение в массиве 1D, который говорит мне индекс, также дал h и v, которые являются как 3 в этом случае. Есть ли способ генерировать индексы в 2D-массиве?

Например, первый элемент в массиве 1D равен 0, который соответствует array[0][0]. Второй элемент равен 1, который соответствует array[0][1]

Я понял, что могу получить вертикальный индекс, выполнив array1d[i] mod vertical_size.

  for getting the vertical index ::: th 

0 = [0] [0] 0 мод 3 = 0 1 = [0] [1] 1 по модулю 3 = 1 2 = [0] [2] 2 мод 3 = 2

3 = [1] [0] и так далее ... 4 = [1] [1] 5 = [1] [2]

6 = [2] [0] 7 = [ 2] [1] 8 = [2] [2]

Но я не уверен, как получить горизонтальный указатель.

ответ

6

Горизонтальный индекс задается floor(i/v) или как только i/v, если ваш язык программирования реализует целочисленное деление по усечению.

Например, пол (7/3) = 2, так что 7 находится на строке 2.

+0

Я не читал ваш ответ правильно в первый раз, и я думал, что вы сказали «i/h», который был ответом, который я пробовал, но не оказался правильным. Я даже не думал о делении на 'v'. Благодаря! – Rhs

+0

Индексы являются либо i/v, либо i% v, либо i/h и i% h, в зависимости от того, как вы их выбираете, если h = v, как здесь, вы не можете отличить – Joni

+0

Я изначально имел что-то, что было 5 2. Я просто разместил 3 на 3 как простой пример. Правильный аналог - пол (i/v) – Rhs

4

Это работает раствор в Java. Обратите внимание, что % - mod функция.

public static void main(String[] args) throws IOException { 
    int[] oneD = {1,2,3,4,5,6}; 
    int w = 3; 
    int h = 2; 
    int[][] twoD = new int[h][w]; 
    int[] oneDReversed = new int[oneD.length]; 

    for (int i = 0; i < h; i++) { 
     for (int j = 0; j < w; j++) { 
      twoD[i][j] = oneD[i*w+j]; 
     } 
    } 

    for (int i = 0; i < w*h; i++) { 
     oneDReversed[i] = twoD[(i/w)][(i%w)]; 
    } 
} 

Почему twoD[i][j] = oneD[i*w+j]? Поскольку у вас есть цикл в цикле делать «Для каждой строки i selet все collumns j и передает его array[num_of_rows][num_of_columns] по equaliation:. row*width + column

Зарезервированные означает: row засчитывается как округляется вниз index разделим number_of_columns И. column - это остальная часть тех же переменных (mod).

+1

Я думаю, что плакат задает обратное направление: один цикл для итерации по 2D-массиву. – phimuemue

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