Перемещение элементов в ArrayList - PullRequest
0 голосов
/ 27 февраля 2012

Я пытаюсь поменять местами элементы в ArrayList, но я не знаю, как определить положение элементов, которые я хочу распилить, потому что это не двумерный массив.Я пытаюсь использовать

Collections.swap(list, 3, 3-1);

Но это не работает.

 List<Integer> list = new ArrayList<Integer>();
 for (int i = 0; i < 16; i++) {
    list.add(i);
}
//System.out.println(list); //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
Collections.shuffle(list);
// System.out.println(list); //[11, 5, 10, 9, 7, 0, 6, 1, 3, 14, 2, 4, 15, 13, 12, 8]

int[][] a2 = new int[4][4];
for (int i = 0; i < 4; i++) {
    for (int j = 0;  j< 4; j++) {


        a2[i][j] = list.get(i*4 + j);
      //  System.out.println(Arrays.deepToString(a2)); //[[11, 5, 10, 9], [7, 0, 6, 1], [3, 14, 2, 4], [15, 13, 12, 8]]
    }
   //System.out.println(Arrays.deepToString(a2)); //[[11, 5, 10, 9], [7, 0, 6, 1], [3,     14, 2, 4], [15, 13, 12, 8]]
 //  System.out.println();
}
for (int[] row : a2) {
System.out.print("[");
for (int i : row)
    System.out.printf("%4d", i);
System.out.println("]");
}
Collections.swap(list, 3, 3-1); //this is where im stuck

 }

Я рассматриваю это как матрицу, поэтому я хочу поменяться.Как работают координаты в ArrayList?

Вывод при запуске:

[  10  15  12   7]
[   0   9   2   6]
[   4   3   1  11]
[   5   8  14  13]

Я хочу поменять местами элементы вверх, вниз и в сторону.

Ответы [ 3 ]

2 голосов
/ 27 февраля 2012

Чтобы поменять элемент на i, j с элементом на k, l, вы можете сделать

Collections.swap(list, i*4+j, k*4+l);
2 голосов
/ 27 февраля 2012

Я не совсем уверен, что понимаю ваш вопрос, но что касается замечания:

«Я не знаю, как определить позицию предметов»

используйте ArrayList.add(int index, E element), таким образом, вы будете знать, что только что добавленный элемент находится в позиции "index"

1 голос
/ 27 февраля 2012

Я предполагаю

  1. Вы хотите работать с матрицей.Это квадрат 4х4 чисел.Правильно?
  2. Вы хотите поменять местами элементы между позициями в матрице
  3. Вы используете два способа представления: 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

Полезно видеть ваш код в виде маленьких блоков кода, каждый из которых выполняет определенную задачу.Вы можете поддерживать абстракции в своем коде и создавать методы (или даже классы ;-) с полезными именами, как я пытался это сделать.Конечно, как и все вещи, это приходит с практикой.Удачи.

Отказ от ответственности

Не всегда пишется все решение, но для того, чтобы узнать, что оно может быть полезным.Так что, это.Надеюсь, это полезно!

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