2014-03-07 102 views
5

我必須實現一個從隨機生成器中獲取其元素的數組。只要數組到達它的最後一個元素,就會調用resize()方法來增加數組的大小。在我的代碼中,每一件事情都會調用,直到調用resize()方法,它不會對數組的大小產生任何影響。它應該增加數組的大小以允許輸入更多的元素。如何將數組的大小加倍

for (int j=0; j<arr.length-1; j++) { 
     random= generator.nextInt(arr.length*4) ; 
     arr[j]=random; 

     } 

    if(arr_size==arr.length){ 
     resize(arr); 
     for (int h=0; h<(arr.length-1)*2; h++) { 
      random= generator.nextInt(arr.length*4) ; 
      arr[h]=random;} 
    } 

這裏是調整():

 private static void resize(int[] arr) { 

    int[] tmp = new int[2*arr.length]; 
    System.arraycopy(arr,0,tmp,0,arr.length); 
    arr = tmp; 
} 

回答

2

任一組和由昆描述返回TMP變量,或者你在arr通過引用傳遞給它持續調整大小功能之外進行更改:

private static void resize(ref int[] arr) { .... } 

,並調用它像

resize(ref arr); 
+0

'ref'是無效的Java。也許你正在考慮C#? – MarredCheese

6

設置arr = tmp沒有做什麼,你認爲它。您只需將resize()方法中的局部變量arr指向局部變量tmp即可。你想要做的是返回tmp並將其分配給arr以外的方法。

if(arr_size==arr.length){ 
    arr = resize(arr); 

,並更改resize()方法簽名

private static int[] resize(int[] arr) { 
    //Resize 
    return tmp; 
} 

帶走的關鍵在於:當傳遞的對象引用在Java中的方法,你傳遞該對象的副本引用,它可以被認爲是該對象的內存位置的副本。對被調用方法中的這個REFERENCE的所有這些操作都不會在該方法之外生效。但是,您可以操縱實際對象本身,因爲正如我所說的那樣,參考指向的內容與同一對象完全相同。

改變位置的內存中的一個副本指向內存中的新位置不會造成原始調用對象引用指向的是同一個位置

+1

感謝很多:) – Jason

0

當你說新的INT,參考值發生改變。 Java使用Copy by Reference並不完全按引用傳遞,如果您更改了引用,則新的調用方法屬性將不會有任何更改,在您的情況下有返回類型並將其分配回arr。

+0

這就是他做什麼.. – Kon

+0

@Kon,剛剛看到並用我的回答更新了 – Kumar

1

試試這個:

private static int[] resize(int[] arr) { 

     int[] tmp = new int[2*arr.length]; 
     System.arraycopy(tmp,0,arr,0,arr.length); 
     System.out.println(tmp.length); 
     arr = tmp; 
     return arr; 
    }