package com.coding.basic.list; import java.util.Objects; /** * Korben's ArrayList * * Created by Korben on 18/02/2017. */ public class KArrayList<T> implements KList<T> { private int size; private Object[] dataArray = new Object[0]; @Override public int size() { return this.size; } @Override public boolean isEmpty() { return this.size == 0; } @Override public boolean contains(Object o) { for (Object obj : dataArray) { if (Objects.equals(obj, o)) { return true; } } return false; } @Override @SuppressWarnings("unchecked") public Object[] toArray() { Object[] array = new Object[size]; System.arraycopy(dataArray, 0, array, 0, size); return array; } @Override public boolean add(T o) { ensureCapacity(size + 1); dataArray[size] = o; size++; return true; } @Override public boolean remove(T o) { int index = indexOf(o); if (index < 0) { return false; } System.arraycopy(dataArray, index + 1, dataArray, index, size - 1 - index); dataArray[size - 1] = null; size--; return true; } @Override public void clear() { for (int i = 0; i < size; i++) { dataArray[i] = null; } size = 0; } @Override @SuppressWarnings("unchecked") public T get(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException(); } return (T) dataArray[index]; } @Override public T set(int index, T element) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException(); } dataArray[index] = element; return element; } @Override public void add(int index, T element) { if (index < 0 || index > size) { throw new IndexOutOfBoundsException(); } ensureCapacity(size + 1); System.arraycopy(dataArray, index, dataArray, index + 1, size - index); dataArray[index] = element; size++; } @Override @SuppressWarnings("unchecked") public T remove(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException(); } T removeData = (T) dataArray[index]; System.arraycopy(dataArray, index + 1, dataArray, index, size - 1 - index); dataArray[size - 1] = null; size--; return removeData; } @Override public int indexOf(T o) { for (int i = 0; i < size; i++) { if (Objects.equals(o, dataArray[i])) { return i; } } return -1; } @Override public KIterator<T> iterator() { return new ArrayListIterator(); } private void ensureCapacity(int minCapacity) { if (minCapacity > dataArray.length) { int newCapacity = Math.max(minCapacity, dataArray.length * 2); Object[] newDataArray = new Object[newCapacity]; System.arraycopy(dataArray, 0, newDataArray, 0, dataArray.length); dataArray = newDataArray; } } private class ArrayListIterator implements KIterator<T> { private int position; ArrayListIterator() { } @Override public boolean hasNext() { return position < size(); } @Override public T next() { if (hasNext()) { return get(position++); } return null; } } }