package array;
//創建動態數組
public class Array<E> {//使用泛型
private E[] data;
private int size;//長度
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;
}
//向所有元素的最後一個元素添加
public void addLast(E e) {
add(size,e);
}
//向第一個添加元素
public void addFirst(E e){
add(0,e);
}
//向數組裏指定的元素添加元素
public void add(int index,E e) {
//符合條件,擴容
if(size==data.length)
resize(2*data.length);
if(index<0||index>size) {
throw new IllegalArgumentException("add failed");
}
for(int i=size-1;i>=index;i--)
data[i+1]=data[i];
data[index]=e;
size++;
}
//獲取index索引位置
public E get(int index) {
if(index<0||index>=size)
throw new IllegalArgumentException("add failed");
return data[index];
}
//修改
void set(int index,E e) {
if(index<0||index>=size)
throw new IllegalArgumentException("add failed");
data[index]=e;
}
@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();
}
//查詢是否有該元素
public boolean contains(E e) {
for(int i=0;i<size;i++) {
if(data[i].equals(e))
return true;
}
return false;
}
//獲得所查找到元素e所在的索引
public int find(E e) {
for(int i=0;i<size;i++) {
if(data[i].equals(e))
return i;
}
return -1;
}
//從數組中刪除元素並且返回
public E remove(int index) {
if(index<0||index>=size) {
throw new IllegalArgumentException("Error");
}
E ret=data[index];
for(int i=index+1;i<size;i++)
data[i-1]=data[i];
size--;
//在此處使用防震擋處理
if(size==data.length/4&&data.length/2!=0)
resize(data.length/2);
return ret;
}
//刪除需要刪除的元素
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<data.length;i++) {
newdata[i]=data[i];
}
data=newdata;
}
public E getLast() {
return get(size-1);
}
public E getFirst() {
return get(0);
}
public E removeLast() {
return remove(size-1);
}
public E removeFirst() {
return remove(0);
}
}
通過動態數組可以實現棧 隊列等等數據結構的應用