深度复制/克隆4D阵列的问题

时间:2015-09-24 02:34:56

标签: java clone deep-copy

我正在尝试深度复制4d int数组作为我的算法的解决方案。不幸的是,当我在程序结束时调用该解决方案时,它不是应该被深度复制的那个。它既不是第一个也不是最后创建的解决方案。我认为问题必须在于deepCopy,因为在1d数组中克隆相同的解决方案可以正常工作。

我正在尝试深度检查w [] [] [] []:

public Object clone()
{   
    MySolution copy = (MySolution)super.clone();
    copy.w = deepCopyOf(w);
    copy.wtour = (int[])this.wtour.clone();

    return copy;
}   // end clone

@SuppressWarnings("unchecked")
public static <T> T[] deepCopyOf(T[] array) {

    if (0 >= array.length) return array;

    return (T[]) deepCopyOf(
            array, 
            Array.newInstance(array[0].getClass(), array.length), 
            0);
}

private static Object deepCopyOf(Object array, Object copiedArray, int index) {

    if (index >= Array.getLength(array)) return copiedArray;

    Object element = Array.get(array, index);

    if (element.getClass().isArray()) {

        Array.set(copiedArray, index, deepCopyOf(
                element,
                Array.newInstance(
                        element.getClass().getComponentType(),
                        Array.getLength(element)),
                0));
    } 
    else {
        Array.set(copiedArray, index, element);
    }
    return deepCopyOf(array, copiedArray, ++index);
}

我正在使用Harder的openTS禁忌搜索框架以及wtour数组被复制得很好的事实告诉我w [] [] [] []

的deepcopy方法一定有问题

编辑:novic3假设我必须迭代不同的数组级别。我尝试了以下方法,它的方法有点不同。不幸的是,它仍然无效。

public static int[][][][] deepCopy2(int[][][][] original) {
    if (original == null) {
        return null;
    }

    final int[][][][] result = new int[original.length][original[0].length][original.length+1][];
    for (int i = 0; i < original.length; i++) {
        for (int j = 0; j < original.length; j++) {
            for (int q= 0; q <= original.length; q++) {
                result[i][j][q] = Arrays.copyOf(original[i][j][q], original[i][j][q].length);

                // For Java versions prior to Java 6 use the next:
                //System.arraycopy(original[i], 0, result[i], 0, original[i].length);
            }
        }
    }
    return result;
}

1 个答案:

答案 0 :(得分:1)

这应该有效:

public int[] deepCopy(int[] w) {
    int[] ans = new int[w.length];
    for (int i = 0; i < w.length; i++) {
        ans[i] = w[i];
    }
    return ans;
}

public int[][] deepCopy2(int[][] w) {
    int[][] ans = new int[w.length][];
    for (int i = 0; i < w.length; i++) {
        ans[i] = deepCopy(w[i]);
    }
    return ans;
}

public int[][][] deepCopy3(int[][][] w) {
    int[][][] ans = new int[w.length][][];
    for (int i = 0; i < w.length; i++) {
        ans[i] = deepCopy2(w[i]);
    }
    return ans;
}

public int[][][][] deepCopy4(int[][][][] w) {
    int[][][][] ans = new int[w.length][][][];
    for (int i = 0; i < w.length; i++) {
        ans[i] = deepCopy3(w[i]);
    }
    return ans;
}

要使用,请致电deepCopy4(w)