package io.github.vxzh; /** * Created by vxzh on 22/02/2017. */ public class ArrayList implements List { private int size = 0; private Object[] elementData; public ArrayList() { this.elementData = new Object[10]; } public int size() { return size; } public boolean isEmpty() { return size == 0; } public boolean add(Object o) { int minCapacity = size + 1; if (minCapacity - elementData.length > 0) grow(minCapacity); elementData[size++] = o; return true; } public boolean add(int index, Object o) { if (index >= size || index < 0) throw new RuntimeException("IndexOutOfBoundsException"); int minCapacity = size + 1; if (minCapacity - elementData.length > 0) grow(minCapacity); elementData[index] = o; size++; return true; } public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { int moved = size - index - 1; if (moved > 0) copy(elementData, index + 1, elementData, index, moved); elementData[--size] = null; return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { int moved = size - index - 1; if (moved > 0) copy(elementData, index + 1, elementData, index, moved); elementData[--size] = null; return true; } } return false; } public boolean remove(int index) { if (index >= size || index < 0) throw new RuntimeException("IndexOutOfBoundsException"); int moved = size - index - 1; if (moved > 0) copy(elementData, index + 1, elementData, index, moved); elementData[--size] = null; return true; } public Object get(int index) { if (index >= size || index < 0) throw new RuntimeException("IndexOutOfBoundsException"); return elementData[index]; } private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; elementData = copy(elementData, newCapacity); } public Object[] copy(Object[] src, int newCapacity) { Object[] arr = new Object[newCapacity]; for (int i = 0; i < src.length; i++) { arr[i] = elementData[i]; } return arr; } public void copy(Object[] src, int srcPost, Object[] dest, int destPost, int length) { for (int i = 0; i < length; i++) { dest[destPost + i] = src[srcPost + i]; } } public Iterator iterator() { return new ListIterator(this); } public class ListIterator implements Iterator { private List list; private int endIndex = 0; private int index = 0; public ListIterator(ArrayList list) { this.list = list; this.endIndex = list.size(); } @Override public boolean hasNext() { return this.index < this.endIndex; } @Override public Object next() { if (!this.hasNext()) { throw new RuntimeException("EmptyElementException"); } else { return list.get(index++); } } } }