package com.coding.basic;
import java.util.Arrays;
import java.util.NoSuchElementException;
/**
* Created by yrs on 2017/2/21.
*/
public class ArrayList implements List{
private int size = 0;
private Object[] elementData;
public ArrayList() {
this.elementData = new Object[10];
}
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = new Object[0];
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
public void add(Object o) {
judegGrow();
elementData[size++] = o;
}
public void add(int index, Object o) {
if(index<0 || index>size) {
throw new IndexOutOfBoundsException();
}else if(index == size) {
add(o);
}else {
judegGrow();
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = o;
size++;
}
}
public Object get(int index) {
rangeCheck(index);
return elementData[index];
}
public Object remove(int index) {
rangeCheck(index);
Object o = elementData[index];
int move = size - 1 -index;
if(move > 0) {
System.arraycopy(elementData, index+1, elementData, index, move);
}
elementData[--size] = null;
return o;
}
public int size() {
return size;
}
public Iterator iterator() {
return new ArrrayListIterator(this);
}
private class ArrrayListIterator implements Iterator {
ArrayList arrayList;
int pos;
private ArrrayListIterator(ArrayList arrayList) {
this.arrayList = arrayList;
}
@Override
public boolean hasNext() {
return pos != arrayList.size;
}
@Override
public Object next() {
if(pos < size) {
int i = pos;
pos++;
return elementData[i];
}else {
throw new NoSuchElementException();
}
}
}
private void judegGrow() {
if(size == elementData.length) {
elementData = Arrays.copyOf(elementData, elementData.length + 1);
}
}
private void rangeCheck(int index) {
if(index<0 || index>=size) {
throw new IndexOutOfBoundsException();
}
}
}