package com.coding.basic.container;
import java.util.NoSuchElementException;
public class ArrayList implements List {
private Object[] elementData;
private int size;
private int capacity;
private static final int DEFAULT_CAPACITY = 8;
public ArrayList() {
elementData = new Object[8];
size = 0;
capacity = DEFAULT_CAPACITY;
}
public boolean add(Object element) {
if (size == capacity) {
Object[] tempArray = new Object[capacity];
for (int i = 0; i < size; i++) {
tempArray[i] = elementData[i];
}
elementData = new Object[capacity * 2];
for (int i = 0; i < size; i++) {
elementData[i] = tempArray[i];
}
elementData[capacity] = element;
capacity = capacity * 2;
}
elementData[size++] = element;
return true;
}
@Override
public void add(int index, Object element) {
checkIndex(index);
Object[] tempArray = new Object[capacity];
for (int i = 0; i < size; i++) {
tempArray[i] = elementData[i];
}
elementData = new Object[capacity * 2];
for (int i = 0; i < size; i++) {
if (i < index) {
elementData[i] = tempArray[i];
} else {
elementData[i + 1] = tempArray[i];
}
}
elementData[index] = element;
capacity = capacity * 2;
size++;
}
@SuppressWarnings("unchecked")
public Object remove(int index) {
checkIndex(index);
Object o = elementData[index];
for (int i = index; i < size; i++) {
elementData[i] = elementData[i + 1];
}
elementData[size] = null;
size = size - 1;
return o;
}
private void checkIndex(int index) {
if (index >= capacity) {
throw new IndexOutOfBoundsException();
}
}
public Object set(int index, Object element) {
checkIndex(index);
Object o = elementData[index];
elementData[index] = element;
return o;
}
@SuppressWarnings("unchecked")
public Object get(int index) {
checkIndex(index);
return (Object) elementData[index];
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < size; i++) {
if (i != size - 1) {
sb.append(elementData[i] + ", ");
} else {
sb.append(elementData[i]);
}
}
sb.append("]");
return sb.toString();
}
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public Iterator iterator() {
return new IteratorArrayList();
}
@Override
public boolean remove(Object element) {
if (element == null)
return false;
int findIndex = -1;
for (int i = 0; i < size; i++) {
if (elementData[i].equals(element)) {
findIndex = i;
break;
}
}
for (int i = findIndex; i < size - 1; i++) {
elementData[i] = elementData[i + 1];
}
elementData[size - 1] = null;
size--;
return false;
}
private class IteratorArrayList implements Iterator {
private int cursor;
@Override
public boolean hasNext() {
return cursor < size;
}
@Override
public Object next() {
if (cursor < size)
return elementData[cursor++];
else
throw new NoSuchElementException();
}
}
}