package com.coding2017.basic;
import java.util.Arrays;
public class ArrayList implements List {
private int size = 0;
private Object[] elementData = new Object[4];
public void add(Object o) {
if (noSpace()) {
extendSpace();
}
elementData[size++] = o;
}
private void extendSpace() {
elementData = Arrays.copyOf(elementData, elementData.length * 2);
}
private boolean noSpace() {
return size == elementData.length;
}
public void add(int index, Object o) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException();
}
if (noSpace()) {
extendSpace();
}
if (index == size) {
add(o);
return;
}
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = o;
size++;
}
public Object get(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
return elementData[index];
}
public Object remove(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
if (index == size - 1) {
return elementData[--size];
}
Object removed = elementData[index];
System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
size--;
return removed;
}
public int size() {
return size;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder("[");
if (size > 0) {
builder.append(get(0));
}
for (int i = 1; i < size; i++) {
builder.append(", ").append(get(i));
}
builder.append("]");
return builder.toString();
}
public Iterator iterator() {
return new ArrayListIterator();
}
private class ArrayListIterator implements Iterator {
private int pos;
@Override
public boolean hasNext() {
return pos < size();
}
@Override
public Object next() {
return ArrayList.this.get(pos++);
}
}
}