回顧資料結構---陣列
阿新 • • 發佈:2018-12-04
沒啥可說的 直接上程式碼
package shuzu; public class Array<E> { private E[] data; private int size; //建構函式 傳入容量capacity public Array(int capacity) { data = (E[]) new Object[capacity]; size = 0; } //無參建構函式 public Array() { this(10); } //獲得陣列長度 public int getSize() { return size; } //獲得陣列容量 public int getCapacity() { return data.length; } //判斷是否為空 public boolean isEmpty() { return size == 0; } //在末尾新增新元素 時間複雜度:0(1) public void addLast(E e) { if (size == data.length) throw new IllegalArgumentException("AddLast failed.Array is full"); data[size] = e; size++; } // 時間複雜度:0(n) public void addFirst(E e) { add(0, e); } //向指定位置插入新元素 時間複雜度:0(n/2)=O(n) public void add(int index, E value) { if (index < 0 || index > size) throw new IllegalArgumentException("Requeire index >= 0 and index <= size"); if (index == data.length) resize(2*data.length); for (int i = size - 1; i >= index; i--) { data[i + 1] = data[i]; } data[index] = value; size++; } 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(); } //獲得索引對應的值 時間複雜度:O(1) public E get(int index) { if (index < 0 || index >= size) throw new IllegalArgumentException("Get failed. Index is illegal"); return data[index]; } //設定索引為index 的值為 e public void set(int index, E e) { if (index < 0 || index >= size) throw new IllegalArgumentException("Get failed. Index is illegal"); data[index] = e; } //查詢陣列中是否有元素e 時間複雜度:O(n) public boolean contains(E e) { for (int i = 0; i < size; i++) { if (data[i] == e) return true; } return false; } //查詢陣列中元素e所在的索引,如果不存在 返回-1 時間複雜度:O(n) public int find(E e) { for (int i = 0; i < size; i++) { if (data[i].equals(e)) return i; } return -1; } //刪除下標為index的元素 將元素返回 時間複雜度:0(n/2)=O(n) 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]; } size--; data[size] = null; //如果實際長度與總長度的1/2相同 進行縮容 if(size == data.length/2) resize(1/2 * data.length); return ret; } //時間複雜度:0(n) public E removeFirst() { return remove(0); } //時間複雜度:0(1) public E removeLast() { return remove(size - 1); } //從陣列中刪除元素e 時間複雜度:0(1) public boolean removeElement(E e) { int index = find(e); if (index != -1) { remove(index); return true; } return false; } //動態陣列 時間複雜度:0(n) private void resize(int s){ E[] newData = (E[])new Object[s]; for(int i = 0;i < size;i++){ newData[i] = data[i]; } data = newData; } }