【问题标题】:Problems with deepCopy/cloning of 4D array4D 数组的 deepCopy/克隆问题
【发布时间】:2015-09-24 02:34:56
【问题描述】:

我正在尝试深度复制一个 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 Tabu Search 框架,而 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;
}

【问题讨论】:

  • 我认为您还需要像&lt;T&gt; T[][] deepCopyOf(T[][] array)&lt;T&gt; T[][][] deepCopyOf(T[][][] array)&lt;T&gt; T[][][][] deepCopyOf(T[][][][] array) 这样的方法。您的代码适用于一维数组。您应该首先尝试 T[][] 的 deepCopy。
  • 谢谢新手。我改变了我的条目。不幸的是,它不起作用。你有什么假设我做错了吗?

标签: java clone deep-copy


【解决方案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)

【讨论】:

  • 谢谢新手!不幸的是,结果与使用我的第一个 deepcopy 方法相同。但是,当我将决策变量从静态切换到非静态时,它会发生变化。可能是这个问题吗?
  • 仅当您从其他地方访问静态变量时,将其从静态更改为非静态才会改变行为。所以这可能是原因之一。问题可能在于使用 clone() 的方式。我测试了 deepCopy4 方法,它适用于 IMO。
猜你喜欢
  • 2021-10-06
  • 2011-05-01
  • 2015-10-24
  • 2010-12-18
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多