package com.coding2017.group7.homework.c0226;
import java.util.Arrays;
public class MyArrayList implements MyList {
private int size = 0;
private Object[] elementData = new Object[10];
@Override
public void add(Object o) {
if (isFull()) {
increase();
}
elementData[size++] = o;
}
@Override
public void add(int index, Object o) {
checkRangeAdd(index);
if (isFull()) {
increase();
}
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = o;
size++;
}
@Override
public Object get(int index) {
checkRangeGet(index);
return elementData[index];
}
@Override
public Object remove(int index) {
checkRangeGet(index);
Object element = elementData[index];
System.arraycopy(elementData, index + 1, elementData, index, size - (index + 1));
elementData[--size] = null;
return element;
}
@Override
public int size() {
return size;
}
public MyIterator iterator() {
return new MyArrayListIterator();
}
private boolean isFull() {
return size >= elementData.length;
}
private void checkRangeGet(int index) {
boolean outOfRange = index < 0 || index >= size;
if (outOfRange) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
}
private void checkRangeAdd(int index) {
boolean outOfRange = index < 0 || index > size;
if (outOfRange) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
}
private void increase() {
Object[] target = new Object[elementData.length * 2];
System.arraycopy(elementData, 0, target, 0, elementData.length);
elementData = target;
}
@Override
public String toString() {
return Arrays.toString(elementData);
}
private class MyArrayListIterator implements MyIterator {
private int index = 0;
@Override
public boolean hasNext() {
return index < size;
}
@Override
public Object next() {
checkRangeGet(index);
return elementData[index++];
}
}
}