2012-10-14 160 views
-3

我想創建一個可擴展的陣列。每當你嘗試向當前數組中添加另一個元素,並且它已滿時,它應該將當前數組中的每個元素複製到新數組中(包括要添加的新元素),然後刪除舊數組。任何人都可以給我一些關於如何做到這一點的指針?可擴展陣列

編輯: 注:我不能使用的ArrayList這個

+4

你可以使用它的ArrayList。它是可擴展的。 – Abubakkar

+0

['ArrayList'](http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html)就是你想要的。 –

+4

爲什麼你不能使用'ArrayList'? – Baz

回答

3

如果你不能使用ArrayList,那麼你將不得不編寫你自己的類,它基本上和ArrayList做同樣的事情。

你的類將需要持有一個數組的引用,以及一個整數,表示有多少個值被放入它中(因爲它可能小於當前數組的大小)。

當元素被添加到數組中時,根據數組的當前大小檢查該整數。如果它小於數組的大小,則意味着有其他元素存在空間,因此只需使用整數作爲索引將新值放入數組中,然後將整數加1即可。如果整數等於或大於數組的大小,則意味着您需要更大的數組,並且必須編寫代碼以創建新數組並將所有值複製到該數組中。

當您創建一個更大的陣列時,您可能希望使其足夠大以容納多個附加值,以便您不必創建新陣列(並複製大量值)你添加一個新的元素。一種常用的技術是使新陣列大小與舊陣列的一定比例,比如150%。

0

你應該使用ArrayList。看到這個tutorial

如果您不能在編輯中使用數組列表,那麼您需要循環該數組並根據當前數組的長度將每個元素移動到更大的數組中。

一個簡單的谷歌搜索應該回答這個問題。

0

正如其他人推薦的,如果可能的話使用ArrayList。但如果因爲某種原因(我猜想功課?)你不能,那麼請看System.arraycopy來有效地複製數組。

1

這段代碼沒有經過測試,但它應該給你一個你應該做什麼的出發點。 我只在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; 
    } 
} 

順便說一句 - 在這段代碼中有很多地方可以改進(效率等)。我鼓勵你試試。這是一個很好的練習:)