我想深入複製一個4d int數組作爲我的算法的解決方案。不幸的是,當我在程序結束時調用該解決方案時,並不是應該對其進行深入研究的方案。它也不是第一個也不是最後創建的解決方案。我認爲問題必須存在於deepCopy中,因爲在1d數組中克隆相同的解決方案可以正常工作。deepCopy/4D陣列克隆問題
我想deepcopy的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);
}
我使用openTS禁忌搜索框架,更硬,該wtour數組被複制就好了這樣的事實讓我發現,對於w [] [] [] [] []
編輯: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 [] [] deepCopyOf方法(T [] []數組)'',' T [] [] [] deepCopyOf(T [] [] [] array)'和' T [] [] [] [] deepCopyOf(T [] [] [] [] array)'' 。你的代碼對於1d數組可以很好地工作。你應該先嚐試T [] []的deepCopy。 –
novic3
謝謝novic。我改變了我的入場。不幸的是,它不起作用。你有什麼假設我做錯了嗎? – Hendrik