2012-01-15 81 views
-1

我有一個二維數組number2。我將它設置爲number2copy與number2copy = number2 然後,我調用一個方法Zeroed將它傳遞給2維數組ToBeZeroed。這個方法用0填充數組,我知道它的工作原理。它返回完全爲零的ToBeZeroed。但是,當我把number2 = ToBeZeroed; number2copy也填充了零。我該如何分解這些東西,使其中一個變化不會導致另一個變化?他們是無關的陣列,所以他們需要分開處理Java數組總是等於

+0

如何發佈實際的代碼? – 2012-01-15 00:52:18

+1

爲什麼地球上你會寫代碼的英文描述,而不是隻發佈代碼本身? – 2012-01-15 00:52:51

回答

4

Java不是C++。您將引用複製到歸屬於第一維的數組,而不是數組對象和數組子對象。您需要使用number2copy = (int[][])deepCopy(number2);,它將執行適合您需求的深度數組副本,包括其中包含的第二維數組副本。用int[][]替代你沒有告訴我們的二維數組數據類型:)另外,要檢查一個對象是否與另一個對象相等,==將檢查對二維數組的第一維數組的引用,這可能不是什麼你要。爲了深入檢查,請使用Arrays.deepEquals(number2, number2copy);,這應該可以正常工作。

深層複製源代碼:

public static Object deepCopy(Object src) 
{ 
    int srcLength = Array.getLength(src); 
    Class srcComponentType = src.getClass().getComponentType(); 

    Object dest = Array.newInstance(srcComponentType, srcLength); 

    if (srcComponentType.isArray()) 
    { 
     for (int i = 0; i < Array.getLength(src); i++) 
      Array.set(dest, i, deepCopy(Array.get(src, i))); 
    } 
    else 
    { 
     System.arraycopy(src, 0, dest, 0, srcLength); 
    } 

    return dest; 
} 

一個簡短的說明見here

編輯:我剛剛注意到,他說二維數組,所以修正的應答者適當:)

0

數組在Java中是Object S和因此有引用語義。也就是說,分配操作x = y;別名以及xy現在都指代相同的實際對象。

(的即相對的是值語義,由此y值獲取複製到不同值x;原始類型如int具有值語義。)

您需要作出顯式new數組並複製數據。


值與引用語義的區別是Java類型系統的一個最重要的方面。

1

我設置它等於與number2copy到number2copy = NUM​​BER2

此時,並且從那時起(除非你一個不同的值分配給任一那些參考文獻的)number2copynumber2指向的相同的陣列。當您通過一個引用更改數組時,更改通過另一個引用可見。

我該如何分解這些東西,使其中一個變化不會導致另一個變化?他們是無關的陣列,所以他們需要好單獨

處理,如果他們是無關的陣列,那麼你不應該做的number2copy = number2 ...因爲這使得他們在同一陣列。


如果你想零2-d數組,你需要做的是這樣的:

for (int i = 0; i < toBeZeroed.length; i++) { 
    for (int j = 0; j < toBeZeroed[i].length; j++) { 
     toBeZeroed[i][j] = 0; 
    } 
} 

如果你想有2 d陣列複製到另一個,則需要做這樣的事情:

for (int i = 0; i < from.length; i++) { 
    for (int j = 0; j < from[i].length; j++) { 
     to[i][j] = from[i][j]; 
    } 
} 

(這裏假定fromto陣列具有相同的尺寸,有沒有空的子陣列,等等)

您可能能夠找到第三方庫,以您需要的方式將零排列或複製數組。然而,在你學習的時候,你會親自實現這些,以幫助你獲得關於Java工作的清晰的心智模型;例如參考分配,什麼是2-d陣列真的是,等...


小心使用clone複製一個2-d(或以上)數組:

  • 它創建一個新的數組對象,您似乎希望將現有數組中的值複製到另一個現有數組中。

  • 它只執行淺拷貝;即新陣列將共享原始陣列的子陣列,並且最終會導致當前正試圖避免更改一個陣列影響另一個陣列的情況。

相關問題