1. 程式人生 > >不要小瞧陣列(用靜態陣列實現我們自己的動態陣列)

不要小瞧陣列(用靜態陣列實現我們自己的動態陣列)

(希望我所描述的一切,給你帶來收穫!)

我們將要使用的是JAVA中的靜態陣列——E[] data = new E[]();去實現一個屬於我們自己的動態陣列

 

第一步:(關於泛型不作過多解釋)

1 public class Array<E> {
2     private E[] data;
3     private int size;
4 }

data是我們需要的陣列,size是我們需要維護的動態陣列的長度;size可以認為是陣列的索引號,size總是指向資料的末端——當整個陣列為空時size指向的是 data[0] 的位置,當陣列只有 data[0] 一個元素時,size指向的資料末端是 data[1];也就是說,size總是指向使用者資料(使用者新增的資料)的後一個位置。

 

第二步:

1 /**
2      *
3      * @param capacity
4      */
5     public Array(int capacity) {
6         data = (E[]) new Object[capacity];
7     }

我們申請一個容量為capacity的陣列,注意!java中不能直接對泛型進行new的操作,但Object是所有類的父類,通過new一個Object再進行型別強轉是行得通的!但是,有時我們並不確定我們所需要多少大小的capacity,為了方便,我們還需要一個無參建構函式,初始化一個預設的capacity陣列(預設的capacity我給的是10)

1 /**
2      * the default capacity is 10
3      */
4     public Array() {
5         this(10);
6     }

第三步:實現一些簡單的操作,例如:獲取當前陣列的長度、判斷陣列是否為空......

 1 /**
 2      *@return the current data length of the array
 3      */
 4     public int getSize() {
 5         return size;
 6     }
 7 
 8     /**
 9
* Determines whether the array is empty 10 * @return false or true 11 */ 12 public boolean isEmpty() { 13 return size == 0; 14 } 15 16 /** 17 * get the Array capacity 18 * @return Array capacity 19 */ 20 public int capacity() { 21 return data.length; 22 }

 我們一定要明確的一點是:使用者只能看到size長度的data(這是外界給予可能是有價值意義的資料),而data.length則只是能承載多少使用者資料的邊界(限度)

 

 第四步:為我們的Array<E>實現增加元素的操作add(int index,E e)方法

 1 /**
 2      * Insert an element on an index
 3      * @param index
 4      * @param e
 5      */
 6     public void add(int index,E e) {
 7         if (index < 0 || index > size)
 8             throw new IllegalArgumentException("Add failed.Array is full");
 9         for (int i = size - 1; i >= index; i--) {
10             data[i+1] = data[i];
11         }
12         data[index] = e;
13         size++;
14     }

 需要注意的是,使用者指定位置插入元素,index值一定要具有合法性——即index屬於[0,size] 

 迴圈體中,data[i+1] = data[i]的語義是明顯的——前一個元素向後一個元素移動。最初的移動在Array的尾部,即是 size - 1 的位置

 

第五步:移除Array中首個e元素(待更........)