Преобразование двумерного индекса массива в одномерный индекс - PullRequest
13 голосов
/ 13 ноября 2009

У меня есть два массива для шахматного варианта, который я кодирую на Java ... Пока у меня есть консольная версия, которая представляет плату в виде 1D-массива (размер 32), но я работаю над созданием графического интерфейса для нее и Я хочу, чтобы он отображался в виде сетки 4x8, поэтому у меня есть двумерный массив JPanels ...

Вопрос в том, существует ли какая-либо формула, которая может преобразовать индекс массива [i] [j] в массив [i], учитывая тот факт, что это массив 4x8?

Ответы [ 5 ]

20 голосов
/ 13 ноября 2009

Думайте об этом так:

У вас есть один массив, который оказывается одномерным массивом, который на самом деле является просто длинной конкатенацией элементов двумерного массива.

Итак, скажем, у вас есть двумерный массив размером 5 x 3 (5 строк, 3 столбца). И мы хотим сделать одномерный массив. Вам нужно решить, хотите ли вы объединить по строкам или по столбцам, для этого примера мы скажем, что это объединение по строкам. Следовательно, каждая строка имеет длину 3 столбца, поэтому вам нужно думать, что ваш одномерный массив определен в «шагах» из 3. Итак, длина вашего одномерного массива будет 5 x 3 = 15, и теперь вы нужно найти точки доступа.

Итак, предположим, что вы получаете доступ ко 2-й строке и 2-му столбцу вашего двумерного массива, тогда это будет 3 шага (первая строка) + количество шагов во второй строке или 3 + 2 = 5 Так как мы начинаем индексирование с нуля, то есть -1, так что это будет с индексом 4.

Теперь для конкретной формулировки:

int oneDindex = (row * length_of_row) + column; // Indexes

Итак, в качестве примера вышесказанного у вас будет

oneDindex = (1 * 3) + 1

И это должно быть

17 голосов
/ 13 ноября 2009

С учетом 4 столбцов по 8 строк:

i = row * 4 + col

РЕДАКТИРОВАТЬ: мой плохой, никто не поймал меня на этой ошибке, по-видимому. Но на самом деле это должно быть row * 4 + col.

row * 8 + col оставит ненужные пробелы в возможных индексах.

9 голосов
/ 13 ноября 2009

Каждая строка в вашем 2D-массиве помещается в конец вашего 1D-массива. i показывает, в какой строке вы находитесь, а j - столбец (как далеко в эту строку). поэтому, если вы находитесь в строке ith, вам нужно поместить i полных строк в конец, а затем добавить к ней j, чтобы получить индекс одного массива.

Так что это будет что-то вроде
singleDimIndex = array[0].length * i + j

3 голосов
/ 13 ноября 2009

i*8+j (при условии 8 - горизонтальная ширина)

1 голос
/ 15 января 2017

Вы можете использовать этот класс ArrayConvertor для преобразования 2D-массивов в 1D-массивы и обратно.

Осторожно: преобразование двумерного массива в обычный работает только с матрицей.

public class ArrayConvertor {
    static public int[] d2Tod1(int[][] array){

        int[] newArray = new int[array.length*array[0].length];

        for (int i = 0; i < array.length; ++i) 
        for (int j = 0; j < array[i].length; ++j) {
            newArray[i*array[0].length+j] = array[i][j];
        }

        return newArray;
    }

    static public int[][] d1Tod2(int[] array, int width){

        int[][] newArray = new int[array.length/width][width];

        for (int i = 0; i < array.length; ++i) {
           newArray[i/width][i%width] = array[i];
        }

        return newArray;
    }
}

И некоторый код тестирования:

public class JavaMain{
    public static void main(String[] args) {
        int[][] arr2D_1 = new int[4][8];

        byte counter=0;
        for (int i = 0; i < 4; i++) 
        for (int j = 0; j < 8; j++) {
            arr2D_1[i][j] = counter++;
        }

        int[]arr1D = ArrayConvertor.d2Tod1(arr2D_1);
        int[][] arr2D_2 = ArrayConvertor.d1Tod2(arr1D, 8);

        boolean equal = true;
        for (int i = 0; i < arr2D_1.length; i++) 
        for (int j = 0; j < arr2D_1[0].length; j++){ 
            if(arr2D_1[i][j]!=arr2D_2[i][j]) equal=false;
        }

        System.out.println("Equal: "+equal);
    }
}

Выход: равно: true

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...