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

配列は参照として保存されるため、配列を 1 つの場所に変更すると、直接保存した別の場所に変更されます。代わりに、同じ値でまったく新しい配列を作成し、それを保存します。それを行うには、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() は 2D 配列の単純な方法です)。

于 2013-06-24T23:49:50.003 に答える