2

我想将所有 int[] 数据保存在我的数组列表中,这样我就可以一步一步地看到每一件事。只有我的问题是它覆盖了我的 ArrayList 中已经存在的 int[]。如何在不覆盖 ArrayList 中的旧 int 的情况下填充我的数组列表?

ArrayList<int[]> lijstje = new ArrayList<int[]>();
    public int[] data = {7,4,8,56,67,85,23,65,23,65,23,22};
int stemp;
int len = 10;
public void shellSort(){
        while (h <= len / 3) {
            h = h * 3 + 1;
        }
        while (h > 0) {

            for (outer = h; outer < len; outer++) {
                stemp = data[outer];
                inner = outer;

                while (inner > h - 1 && data[inner - h] >= stemp) {
                    data[inner] = data[inner - h];
                    inner -= h;
                }
                data[inner] = stemp;
                lijstje.add(data);
            }
            h = (h - 1) / 3;
        }
    }
4

1 回答 1

3

数组存储为引用,因此当您将数组更改为一个位置时,您直接存储的其他任何位置都会更改为。相反,创建一个具有相同值的全新数组,并存储它。为此,请执行 array.clone(),所以对你来说

ArrayList<int[]> lijstje = new ArrayList<int[]>();
public int[] data = {7,4,8,56,67,85,23,65,23,65,23,22};
int stemp;
int len = 10;
public void shellSort(){
    while (h <= len / 3) {
        h = h * 3 + 1;
    }
    while (h > 0) {

        for (outer = h; outer < len; outer++) {
            stemp = data[outer];
            inner = outer;

            while (inner > h - 1 && data[inner - h] >= stemp) {
                data[inner] = data[inner - h];
                inner -= h;
            }
            data[inner] = stemp;
            lijstje.add(data.clone()); // Notice here how it's data.clone() instead of just data
        }
        h = (h - 1) / 3;
    }
}

这是一个显示如何通过引用传递数组的示例,这个

int[] original = { 1, 2, 3 };
int[] passedByReference = original;
int[] cloned = original.clone();
System.out.println("Before:");
System.out.println(Arrays.toString(original));
System.out.println(Arrays.toString(passedByReference));
System.out.println(Arrays.toString(cloned));
original[0]=10;
System.out.println("After:");
System.out.println(Arrays.toString(original));
System.out.println(Arrays.toString(passedByReference));
System.out.println(Arrays.toString(cloned));

将有以下输出

Before:
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
After:
[10, 2, 3]
[10, 2, 3]
[1, 2, 3]

如您所见,克隆的不受影响,而原始的和通过引用传递的则不受影响。在您的代码中,您不希望对原始数据的更改影响您存储的数组,因此您必须以某种方式克隆它(array.clone() 是二维数组的一种很好的简单方法)。

于 2013-06-24T23:49:50.003 回答