我正在尝试在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]
我想要向上,向下和横向交换元素。
答案 0 :(得分:2)
我不太清楚我理解你的问题,但至于这句话:
“我不知道如何获得物品的位置”
使用ArrayList.add(int index, E element)
,这样你就会知道你刚添加的元素是poistion“index”
答案 1 :(得分:2)
要将i
,j
上的元素与k
上的元素交换,l
,您可以
Collections.swap(list, i*4+j, k*4+l);
答案 2 :(得分:1)
我假设
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是每行的大小。
更改方法
如果您想要的只是使用该列表进行改组(因为所有其余的处理不需要列表而是矩阵)我建议:仅使用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方法现在返回一个新矩阵!!
<强>底线强>
将代码视为小块代码,每个代码都执行一些明确定义的任务,这很有用。您可以在代码中维护抽象并使用有用的名称创建方法(甚至是类;-),就像我尝试的那样。当然,就像练习所带来的一切。祝你好运。
<强>声明强>
编写所有解决方案并不常见,但为了学习它可能很有用。就是这样。希望它有用!