2015-09-24 82 views
0

我想深入複製一個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; 
} 
+0

我想你還需要像' T [] [] deepCopyOf方法(T [] []數組)'',' T [] [] [] deepCopyOf(T [] [] [] array)'和' T [] [] [] [] deepCopyOf(T [] [] [] [] array)'' 。你的代碼對於1d數組可以很好地工作。你應該先嚐試T [] []的deepCopy。 – novic3

+0

謝謝novic。我改變了我的入場。不幸的是,它不起作用。你有什麼假設我做錯了嗎? – Hendrik

回答

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)

+0

謝謝novic!不幸的是,結果與使用我的第一個深度拷貝方法相同。當我將決策變量從靜態切換到非靜態時,它會發生變化。這可能是問題嗎? – Hendrik

+1

僅當您從其他地方訪問靜態變量時,將其從靜態更改爲非靜態纔會更改行爲。所以這可能是其中一個原因。問題可能在克隆()正在使用的方式。我測試了deepCopy4方法,它可以工作IMO。 – novic3