Подтвердить что ты не робот

Преобразование индекса 2D-массива в 1D-индекс

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

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

4b9b3361

Ответ 1

Учитывая 4 столбца на 8 строк, выполните:

i = row * 4 + col

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

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

Ответ 2

Подумайте об этом так:

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

Итак, скажем, у вас есть двумерный массив размером 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

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

Ответ 3

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

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

Ответ 4

i*8+j (предполагая, что 8 - горизонтальная ширина)

Ответ 5

Вы можете использовать этот класс 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