package task0228.coding.basic; import java.util.NoSuchElementException; public class ArrayList implements List { private int size = 0; private Object[] elementData = new Object[100]; public void add(Object o) { int len = size + 1; if (len > elementData.length) { Object[] newElemDate = new Object[elementData.length + 1]; System.arraycopy(elementData, 0, newElemDate, 0, elementData.length); elementData = newElemDate; } elementData[size] = o; size++; } public void add(int index, Object o) { if (index < 0 || index > size) { throw new IndexOutOfBoundsException("index:" + index + "size:" + size); } if (index == size) { add(o); } else { Object[] newElemData = new Object[elementData.length + 1]; System.arraycopy(elementData, 0, newElemData, 0, index); newElemData[index] = o; System.arraycopy(elementData, index, newElemData, index + 1, size - index); elementData = newElemData; size++; } } public Object get(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("index:" + index + "size:" + size); } return elementData[index]; } public Object remove(int index) { if (index >= size) { throw new IndexOutOfBoundsException("index:" + index + "size:" + size); } Object removeElement = elementData[index]; if(index != (size-1)){ Object[] newElemData = new Object[elementData.length]; System.arraycopy(elementData, 0, newElemData, 0, index); System.arraycopy(elementData, index+1, newElemData, index, size - index -1); } size--; return removeElement; } public int size() { return size; } public Iterator iterator() { return new MyIterator(); } private class MyIterator implements Iterator { private int cursor = 0; private MyIterator() {} @Override public boolean hasNext() { return cursor < size; } @Override public Object next() { // TODO Auto-generated method stub if (cursor >= size) { throw new IndexOutOfBoundsException(); } return get(cursor++); } @Override public Object remove() { // TODO Auto-generated method stub if (cursor <= 0) { throw new NoSuchElementException(); } Object val = ArrayList.this.remove(--cursor); return val; } } }