Я предполагаю
- Вы хотите работать с матрицей.Это квадрат 4х4 чисел.Правильно?
- Вы хотите поменять местами элементы между позициями в матрице
- Вы используете два способа представления:
List<Integer>
и int[][]
Как поменять местами массив
Позиция (i, j)
в вашей матрице просто a2[i][j]
, поэтому перестановка между (i, j)
и (k, l)
составляет:
int aux = a2[k][l];
a2[k][l] = a[i][j]; // move value at first point to second point
a2[i][j] = aux; // move value at second poin tof irst point
Как поменять местами список
Позиция (i, j)
в вашем списке (из-за способа, которым вы его сохранили) - 4*i+j
.Итак, индексы для тех же точек в списке (как сказал @aioobe):
4*i+j
4*k+l
Так что вам нужно сделать это:
Collections.swap(list, 4*i+j, 4*k+l);
, где 4 - размеркаждой строки.
Изменение подхода
Если вы хотите просто использовать этот список для тасования (потому что вся остальная обработка ненужен список, но матрица) Я предлагаю: использовать только Список для того, чтобы перетасовать и забыть .Как?
// at this point you only have a matrix: your `int a2[][]`
// and the List will only exist for the shuffling
// lets say that WIDTH HEIGHT exist and are int constants
List<Integer> tempList = new ArrayList<Integer>(WIDTH*HEIGHT);
for (int i=0; i<HEIGHT; i++)
for (int j=0; j<WIDTH; j++)
list.add(a2[i][i]);
// now your integers are in the list and you can shuffle them
Collections.shuffle(tempList);
// now give the numbers back to the matrix (as on your previous code)
for (int i=0; i<HEIGHT; i++)
for (int j=0; j<WIDTH; j++)
a2[i][i] = list.get(i*WIDTH+j);
// and you can forget your tempList
Еще лучше сделать этот метод следующим образом:
private void shuffle(int[][] matrix, int width, int height) {
List<Integer> tempList = new ArrayList<Integer>(width*height);
for (int i=0; i<height; i++)
for (int j=0; j<width; j++)
list.add(matrix[i][i]);
// now your integers are in the list and you can shuffle them
Collections.shuffle(tempList);
// now give the numbers back to the matrix (as on your previous code)
for (int i=0; i<height; i++)
for (int j=0; j<width; j++)
matrix[i][i] = tempList.get(i*width+j);
}
Обратите внимание, что tempList существует только при выполнении метода.
Еще лучше: создайте два методадля преобразования из матричного представления в список и наоборот.Таким образом, вы можете использовать их в других местах (и ваш код будет более читабельным).Например, вы можете выполнить рефакторинг своего кода для инициализации упорядоченного списка и вызова этого метода для преобразования его в матрицу int.
private List<Integer> toList(int[][] matrix, int width, int height) {
List<Integer> list = new ArrayList<Integer>(width*height);
for (int i=0; i<height; i++)
for (int j=0; j<width; j++)
list.add(matrix[i][i]);
return list;
}
private int[][] toMatrix(List<Integer> list, int width, int height) {
// now give the numbers back to the matrix (as on your previous code)
int[][] result = new int[height][];
for (int i=0; i<height; i++) {
result[i] = new int[width];
for (int j=0; j<width; j++)
result[i][i] = list.get(i*width+j);
}
return result;
}
private int[][] shuffle(int[][] matrix, int width, int height) {
List<Integer> tempList = toList(matrix, width, height);
// now your integers are in the list and you can shuffle them
Collections.shuffle(tempList);
return toMatrix(tempList, width, height);
}
Обратите внимание, toMatrix и методы shuffle теперь возвращают новую матрицу!!
Bottomline
Полезно видеть ваш код в виде маленьких блоков кода, каждый из которых выполняет определенную задачу.Вы можете поддерживать абстракции в своем коде и создавать методы (или даже классы ;-) с полезными именами, как я пытался это сделать.Конечно, как и все вещи, это приходит с практикой.Удачи.
Отказ от ответственности
Не всегда пишется все решение, но для того, чтобы узнать, что оно может быть полезным.Так что, это.Надеюсь, это полезно!