Преобразование индекса 2D-массива в 1D-индекс
У меня есть два массива для шахматного варианта. Я кодирую в java... У меня есть консольная версия до сих пор, которая представляет плату как массив 1D (размер 32), но я работаю над созданием графического интерфейса для него и Я хочу, чтобы он отображался как сетка 4x8, поэтому у меня есть двумерный массив JPanels...
Вопрос: есть ли какая-либо формула, которая может преобразовать индекс массива [i] [j] в массив [i], учитывая факт его массива 4x8?
Ответы
Ответ 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