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 add(int index,E e){
if (index<0||index>size)
throw new IllegalArgumentException("add failed");
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++;
}
private void resize(int capacity){
E[] newData=(E[])new Object[capacity];
for (int i = 0; i <size ; i++)
newData[i]=data[i];
data=newData;
}
public void addFirst(E e){
this.add(0,e);
}
public void addLast(E e){
this.add(size,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();
}
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;
return;
}
public boolean contains(E e){
for (int i = 0; i <size ; i++) {
if (data[i]==e)
return true;
}
return false;
}
public int find(E e){
for (int i = 0; i <size ; i++) {
if (data[i]==e)
return i;
}
return -1;
}
public E remove(int index){
if (index<0||index>=size)
throw new IllegalArgumentException("remove failed");
E e=data[index];
for (int i = index+1; i <size ; i++) {
data[i-1]=data[i];
}
size--;
if (size==data.length/2){
resize(data.length/4);
}
return e;
}
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);
}
}