我想創建一個可擴展的陣列。每當你嘗試向當前數組中添加另一個元素,並且它已滿時,它應該將當前數組中的每個元素複製到新數組中(包括要添加的新元素),然後刪除舊數組。任何人都可以給我一些關於如何做到這一點的指針?可擴展陣列
編輯: 注:我不能使用的ArrayList這個
我想創建一個可擴展的陣列。每當你嘗試向當前數組中添加另一個元素,並且它已滿時,它應該將當前數組中的每個元素複製到新數組中(包括要添加的新元素),然後刪除舊數組。任何人都可以給我一些關於如何做到這一點的指針?可擴展陣列
編輯: 注:我不能使用的ArrayList這個
如果你不能使用ArrayList,那麼你將不得不編寫你自己的類,它基本上和ArrayList做同樣的事情。
你的類將需要持有一個數組的引用,以及一個整數,表示有多少個值被放入它中(因爲它可能小於當前數組的大小)。
當元素被添加到數組中時,根據數組的當前大小檢查該整數。如果它小於數組的大小,則意味着有其他元素存在空間,因此只需使用整數作爲索引將新值放入數組中,然後將整數加1即可。如果整數等於或大於數組的大小,則意味着您需要更大的數組,並且必須編寫代碼以創建新數組並將所有值複製到該數組中。
當您創建一個更大的陣列時,您可能希望使其足夠大以容納多個附加值,以便您不必創建新陣列(並複製大量值)每你添加一個新的元素。一種常用的技術是使新陣列大小與舊陣列的一定比例,比如150%。
使用 ArrayList檢查javadoc的,我認爲這是你在尋找
我建議你檢查ArrayList類的source code。
正如其他人推薦的,如果可能的話使用ArrayList。但如果因爲某種原因(我猜想功課?)你不能,那麼請看System.arraycopy來有效地複製數組。
這段代碼沒有經過測試,但它應該給你一個你應該做什麼的出發點。 我只在Integer上實現,但我相信你可以擴展更多。
public class ExtendableArray {
private Integer[] arr;
public ExtendableArray(int capacity) {
arr = new Integer[capacity];
}
public void add(Integer item) {
if (getLastIndex() == arr.length) {
generateBiggerArray();
return;
}
for (int i = 0; i < arr.length; i++) {
if (arr[i] == null) {
arr[i] = item;
break;
}
}
}
private void generateBiggerArray() {
int currentCapacity = arr.length;
Integer[] tempArr = new Integer[currentCapacity + 4];
for(int i = 0; i < arr.length; i++) {
tempArr[i] = arr[i];
}
this.arr = tempArr;
}
private int getLastIndex() {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == null)
return i;
}
return arr.length;
}
}
順便說一句 - 在這段代碼中有很多地方可以改進(效率等)。我鼓勵你試試。這是一個很好的練習:)
你可以使用它的ArrayList。它是可擴展的。 – Abubakkar
['ArrayList'](http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html)就是你想要的。 –
爲什麼你不能使用'ArrayList'? – Baz