package Collection;
import com.coding.basic.List;
import java.util.NoSuchElementException;
import com.coding.basic.Iterator;
public class ArrayList implements List {
private int size;
private Object[] elementData;
public ArrayList() {
size = 0;
elementData = new Object[10];
}
public ArrayList(Object o) {
size = 0;
elementData = new Object[10];
this.add(o);
}
public ArrayList(int initialCapacity) {
size = 0;
elementData = new Object[initialCapacity];
}
@Override
public void add(Object o) {
if (size <= elementData.length - 1) {
elementData[size] = o;
size++;
} else {
this.extendCapacity();
elementData[size] = o;
size++;
}
}
@Override
public void add(int index, Object o) {
if (index < 0) {
throw new IndexOutOfBoundsException();
}
if (index > elementData.length - 1) {
while (index > elementData.length - 1) {
this.extendCapacity();
}
elementData[index] = o;
size = index + 1;
return;
}
if (index >= size) {
size = index + 1;
elementData[index] = o;
return;
}
if (index >= 0 && index < size) {
this.moveRearward(index);
elementData[index] = o;
size++;
return;
}
}
@Override
public Object get(int index) {
checkCapacity(index);
if (index < size) {
return elementData[index];
}
return null;
}
@Override
public Object remove(int index) {
checkCapacity(index);
if (index == size - 1) {
size--;
return elementData[size - 1];
}
if (index < size - 1) {
Object tmp = elementData[index];
for (int i = index; i < size - 1; i++) {
elementData[i] = elementData[i + 1];
}
size--;
return tmp;
}
return null;
}
private void checkCapacity(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
}
private void extendCapacity() {
Object[] elements = new Object[elementData.length + 10];
for (int i = 0; i < size; i++) {
elements[i] = elementData[i];
}
elementData = elements;
}
@Override
public int size() {
return size;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(elementData[i]);
sb.append(",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append("]");
return sb.toString();
}
private void moveRearward(int index) {
size++;
if (size >= elementData.length - 1)
this.extendCapacity();
for (int i = size - 1; i > index; i--) {
elementData[i] = elementData[i - 1];
}
}
public Iterator iterator() {
return new ArrayListIterator();
}
private class ArrayListIterator implements Iterator {
private int pos;
public ArrayListIterator() {
pos = 0;
}
@Override
public boolean hasNext() {
if (pos < size) {
return true;
}
return false;
}
@Override
public Object next() {
if (hasNext()) {
return elementData[pos++];
} else
throw new NoSuchElementException();
}
}
}