2011-04-06 159 views
1

我正在處理這個表示整數列表的NumberList類。 NumberList對象只有一個實例變量,它是對int值數組的引用。一個的我需要實現是假設的參數添加到列表中的由端部的方法:如何將一個參數添加到數組的末尾?

a)創建複製所有的另一個數組,它是一個單元比現有的一個

b時)從現有的陣列元件轉移到新的一個

c)將所述參數的新的數組

d)重新分配實例變量「值」,以便它指的是新的數組的末尾。

這是我的嘗試。沒有錯誤,但我覺得它是不正確的,尤其是我嘗試將數字添加到anotherArray的末尾的部分。我指的參數是「數字」,一個int

public void add(int number) { 
    int[] anotherArray; 
    int newLength = values.length + 1; 

    anotherArray = new int[newLength]; 

    for (int i = 0; i <values.length; i++) 
     values[i] = anotherArray[i]; 

    for (int i = 0; i < anotherArray[i]; i++) 
     anotherArray[i] += number; 



    values = new int[anotherArray.length]; 
} 
+0

你確定你不想使用預定義的ArrayList類? – 2011-04-06 23:39:50

+0

@Grzegorz這看起來像我的作業,所以OP可能不被允許使用ArrayList 。 – Sean 2011-04-06 23:41:44

回答

4

首先,你已經得到了分配倒退。它應該是圍繞這樣:

for (int i = 0; i < values.length; i++) 
    anotherArray[i] = values[i]; 

這種分配valuesanotherArray。其次,要anotherArray設置新值,就像這樣:

anotherArray[newLength - 1] = number; 

最後,

values = anotherArray; 

這裏的另一種方式使用System.arraycopy編寫代碼:

public void add(int number) { 
    int[] anotherArray = new int[values.length + 1]; 
    System.arraycopy(values, 0, anotherArray, 0, values.length); 
    anotherArray[values.length] = number; 
    values = anotherArray; 
} 
0

你並不需要兩個for循環做到這一點,因爲你只需要從舊的數組中的元素複製到新陣列一次。

你也不想做values = new int[anotherArray.length];,因爲這本質上是聲明一個沒有設置值的新數組。

的邏輯應該是這個樣子:

newArray = new Array[old_length + 1]; 
for (i from 0 to old_length) { 
    newArray[i] = values[i]; 
} 
newArray[old_length] = new_element 
values = newArray 
0

看起來大多數情況下,你在正確的軌道上,但是當你嘗試添加到新的ar的末尾時,它開始脫軌射線...

從我可以告訴,所有你需要的是這樣的......

'公共無效添加(INT數){ INT [] anotherArray; int newLength = values。長度+ 1;

anotherArray = new int[newLength]; 

for (int i = 0; i <values.length; i++) 
    anotherArray[i] = values[i]; 

anotherArray[newLength-1] = number; 

values = anotherArray.length; 

} `

0

我建議你NumberList類的實現一些變化:

  • 添加 「計數」 的實例變量你NumberList類,它代表了列表中的整數數量。這對你想要分配一個比當前有整數的數組長的情況很有用,例如你最初可以有一個長度爲10的數組,但是有== 0
  • 然後如果你想添加一個新的整數並且在數組中仍然有空格,你需要做的就是把整數放在數組的正確位置並計算++
  • 當你需要重新分配數組(例如,如果count == array.length當你嘗試添加一個新的整數),那麼你應該使新的數組有點大,例如是前一個數組的大小的兩倍。這將避免重新分配添加了每個整數的數組。
  • 使用System.arraycopy舊數組的值複製到新的數組(其長度等於「計數」)在你的算法
0

看部分B,c和d,並仔細比較與您的代碼。

第一個for循環執行b部分。但是請將您的代碼與「將現有數組中的所有元素複製到新數組」的語句進行比較。這是你的代碼在做什麼?不完全,但幾乎。您的代碼將新數組中的值分配給現有數組。

現在考慮一下c部分的陳述。這是否需要一個循環?不,不是的。但首先,讓我們討論這個循環的問題,作爲一個學習練習。首先,它可能會生成IndexOutOfBoundsException,因爲您的循環條件爲i < anotherArray[i]。數組中的值與它們的大小無關,因此如果所有值都很大,則i將增加到數組的末尾。另外,你爲什麼要爲每個元素添加number

現在,至於解決它,請看看聲明c。它說要將它添加到新陣列的末尾。在這種情況下(以及涉及數據結構的所有情況),「添加」意味着「插入」而不是「+」。你用一個額外的元素創建了一個新的數組;該元素當前爲空。這個新元素到底是什麼,需要持有number

最後,您的最後陳述只是使values指向一個新的空陣列。相反,您應該將values參考點設置爲您已創建並填充值的數組。

0

你不需要第二個循環,你只需要在數組的最後一個位置添加最後一個數字。

public void add(int number) { 
int[] anotherArray; 
int newLength = values.length + 1; 
anotherArray = new int[newLength]; 
for (int i = 0; i <values.length; i++) 
    values[i] = anotherArray[i]; 

    //for (int i = 0; i < anotherArray[i]; i++) 
anotherArray[anotherArray.lenth-1] = number; 
    values = new int[anotherArray.length]; 

}

相關問題