在ArrayList中移动元素

时间:2012-02-27 15:08:06

标签: java collections arraylist

我正在尝试在ArrayList中交换元素,但我不知道如何获取我想要锯的项目的位置,因为它不是2D数组。我正在尝试使用

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 个答案:

答案 0 :(得分:2)

我不太清楚我理解你的问题,但至于这句话:

“我不知道如何获得物品的位置”

使用ArrayList.add(int index, E element),这样你就会知道你刚添加的元素是poistion“index”

答案 1 :(得分:2)

要将ij上的元素与k上的元素交换,l,您可以

Collections.swap(list, i*4+j, k*4+l);

答案 2 :(得分:1)

我假设

  1. 您想使用矩阵。那个4x4平方的数字。正确?
  2. 您想要在矩阵中的位置之间交换元素
  3. 您使用两种表示方式:List<Integer>int[][]
  4. 如何与数组交换

    您的矩阵中的排名(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是每行的大小。


    更改方法

    如果您想要的只是使用该列表进行改组(因为所有其余的处理不需要列表而是矩阵)我建议:仅使用List进行洗牌并忘记 。怎么样?

    // 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方法现在返回一个新矩阵!!

    <强>底线

    将代码视为小块代码,每个代码都执行一些明确定义的任务,这很有用。您可以在代码中维护抽象并使用有用的名称创建方法(甚至是类;-),就像我尝试的那样。当然,就像练习所带来的一切。祝你好运。

    <强>声明

    编写所有解决方案并不常见,但为了学习它可能很有用。就是这样。希望它有用!