package datastructure.array;
import java.util.Arrays;
import datastructure.Iterator;
import datastructure.List;
public class ArrayList implements List {
private int size = 0;
private Object[] elementData = new Object[100];
@Override
public void add(Object o) {
ensureCapacity(size + 1);
elementData[size++] = o;
}
private void ensureCapacity(int size) {
if (size > elementData.length) {
grow();
}
}
private void grow() {
elementData = Arrays.copyOf(elementData, size * 2);
}
@Override
public void add(int index, Object o) {
rangeCheckForAdd(index);
ensureCapacity(size + 1);
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = o;
size++;
}
private void rangeCheckForAdd(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException();
}
}
@Override
public Object get(int index) {
rangeCheck(index);
return elementData[index];
}
private void rangeCheck(int index) {
if (index >= size || index < 0) {
throw new IndexOutOfBoundsException();
}
}
@Override
public Object remove(int index) {
rangeCheck(index);
Object dest = elementData[index];
System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
size--;
return dest;
}
@Override
public int size() {
return size;
}
public Iterator iterator() {
return new Iterator() {
private int index = 0;
@Override
public Object next() {
return elementData[index++];
}
@Override
public boolean hasNext() {
return index < size;
}
};
}
}