【发布时间】: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;
}
【问题讨论】:
-
我认为您还需要像
<T> T[][] deepCopyOf(T[][] array)、<T> T[][][] deepCopyOf(T[][][] array)和<T> T[][][][] deepCopyOf(T[][][][] array)这样的方法。您的代码适用于一维数组。您应该首先尝试 T[][] 的 deepCopy。 -
谢谢新手。我改变了我的条目。不幸的是,它不起作用。你有什么假设我做错了吗?