資料結構筆記_動態陣列的實現
阿新 • • 發佈:2018-11-10
public class Array<E> { private E[] data; private int size; public Array(int capacity){ data = (E[])new Object[capacity]; //不能直接new一個泛型陣列,需要先new一個Object陣列再強轉為泛型陣列。 } public Array(){ this(10); } public int getSize(){ return size; } public int getCapacity(){ return data.length; } public boolean isEmpty(){ return size==0; } public void add(int index, E e){ if (index <0 || index>size){ throw new IllegalArgumentException("Add failed! Require index>=0 and index<=size."); } if (size==data.length){ resize(2*data.length); } for (int i=size-1; i>=index; i--){ data[i+1]=data[i]; } data[index]=e; size++; } public void addFirst(E e){ add(0,e); } public void addLast(E e){ add(size,e); } public E get(int index){ if (index<0 || index>=size){ throw new IllegalArgumentException("Get failed! Index is illegal."); } return data[index]; } public void set(int index, E e){ if(index<0 || index>=size){ throw new IllegalArgumentException("Set failed! Index is illegal."); } data[index]=e; } public boolean contains(E e){ for (int i=0; i<size; i++){ if (data[i].equals(e)){ return true; } } return false; } public int find(E e) { for (int i=0; i<size; i++){ if(data[i].equals(e)){ return i; } } return -1; } //刪除索引為index的元素,並返回被刪除的元素 public E remove(int index){ if(index<0 || index>=size){ throw new IllegalArgumentException("Remove failed! Index is illegal."); } E ret=data[index]; for (int i=index+1; i<size; i++){ data[i-1]=data[i]; //儘量不要使用data[i]=data[i+1] i+1可能會發生陣列越界 } size--; data[size]=null; //無用的遊離狀態元素 if(size==data.length/4 && data.length/2!=0){ //採用更lazy的方法,防止在size=capacity時來回加減元素時發生複雜度震盪的情況。 resize(data.length/2); } return ret; } public E removeFirst(){ return remove(0); } public E removeLast(){ return remove(size-1); } public void removeElement(E e){ int index=find(e); if(index!=-1){ remove(index); } } //實現動態陣列 private void resize(int newCapacity){ E[] newData=(E[])new Object[newCapacity]; for(int i=0; i<size; i++){ newData[i]=data[i]; } data=newData; //newData在函式退出後會被回收,data是全域性變數,生存週期和類一樣 } @Override public String toString(){ StringBuilder res = new StringBuilder(); res.append(String.format("Array: size: %d, capacity: %d\n",size, data.length)); res.append("["); for (int i=0; i<size; i++){ res.append(data[i]); if (i!=size-1){ res.append(", "); } } res.append("]"); return res.toString(); } }