我试图做一个二维数组的ArrayList。 它是我添加到ArrayList的相同的2个暗淡数组,但每次都有不同的值。 问题是:当我将数组添加到列表中时,它会自动更新列表中其他版本的数组。 我试图在将数组添加到List之前克隆/复制数组,但它没有效果。
import java.util.*;
public class Test {
static ArrayList<int[][]> list = new ArrayList<int[][]>();
public static void main(String[] args) {
Lister L = new Lister();
}
public static void add(int[][] array) {
list.add(array);
printArray();
}
public static void printArray() {
for (int i = 0; i < list.size(); i++) {
System.out.println("Element: " + i);
printDim(list.get(i));
}
System.out.println("--------------------------------");
}
public static void printDim(int[][] array) {
for (int x = 0; x < array.length; x++) {
for (int y = 0; y < array[0].length; y++) {
System.out.print(array[y][x]+" ");
}
System.out.println();
}
System.out.println("-----------");
}
}
class Lister {
Lister() {
int[][] array1 = new int[5][5];
array1[0][4] = 1;
Test.add(array1);
int[][] array2 = array1.clone();
array2[1][2] = 1;
Test.add(array2);
}
}
输出:
Element: 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 0 0 0 0
---------------------
Element: 0
0 0 0 0 0
0 0 0 0 0
0 1 0 0 0
0 0 0 0 0
1 0 0 0 0
-----------
Element: 1
0 0 0 0 0
0 0 0 0 0
0 1 0 0 0
0 0 0 0 0
1 0 0 0 0
--------------------
预期产出:
Element: 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 0 0 0 0
--------------------
Element: 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 0 0 0 0
-----------
Element: 1
0 0 0 0 0
0 0 0 0 0
0 1 0 0 0
0 0 0 0 0
1 0 0 0 0
---------------------
答案 0 :(得分:1)
这是因为您仍在使用相同的&#39;矩阵&#39;类型为irb(main):016:0> lamb = -> (a, b) { [a,b].join(" ") }
=> #<Proc:0x007f81dc983ec8@(irb):16 (lambda)>
irb(main):017:0> lamb.call("Hello", "World")
=> "Hello World"
。这应该通过在使用第一个之后再次声明它来修复。
int
答案 1 :(得分:1)
2D数组不能浅层复制。因为它是一个数组数组,所以浅拷贝会给你一个新的外部数组,它保存对与原始数组相同的内部数组的引用。
您需要实现深层复制:
int[][] array2 = array1.clone();
for (int i = 0; i < array2.length; i++) {
array2[i] = array1[i].clone();
}
请注意,这仅适用于原始数组。如果你有对象数组,你也需要复制每个对象(除了引用相同的对象你没问题。)