package com.coding.basic.array;
import com.coding.basic.Iterator;
import com.coding.basic.List;
import java.util.Arrays;
public class ArrayList implements List {
private int size = 0;
private Object[] elementData = new Object[100];
private Iterator iterator = new ArrayListIterator();
private int length() {
return elementData.length;
}
private static final int ENLARGE_LENGTH = 100;
private Object[] enlarge(Object[] origin) {
return Arrays.copyOf(origin, origin.length + ENLARGE_LENGTH);
}
private void enLargeElementData() {
if (size == length()) {
elementData = enlarge(elementData);
}
}
public void add(Object o) {
enLargeElementData();
elementData[size] = o;
size++;
}
public void add(int index, Object o) {
checkForAdd(index);
enLargeElementData();
// 备份 index 处及后面的数据
Object[] elementsBehindIndex = backBehindElements(elementData, index);
// 给index处 设值
elementData[index] = o;
// 追加 备份的数据
appendElement(elementData, index, elementsBehindIndex);
size++;
}
private void appendElement(Object[] origin, int pos, Object[] append) {
System.arraycopy(append, 0, origin, pos, append.length);
}
private Object[] backBehindElements(Object[] elementData, int index) {
int backSize = size - index;
Object[] back = new Object[backSize];
System.arraycopy(elementData, index, back, 0, backSize);
return back;
}
public Object get(int index) {
checkIndex(index);
return elementData[index];
}
private void checkIndex(int index) {
if (index < 0 || index >= size) {
throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size));
}
}
private void checkForAdd(int index) {
if (index < 0 || index > size) {
throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size));
}
}
public Object remove(int index) {
checkIndex(index);
Object[] back = backBehindElements(elementData, index + 1);
System.arraycopy(back, 0, elementData, index, back.length);
Object ret = elementData[index];
elementData[index] = null;
size--;
return ret;
}
public int size() {
return size;
}
public Iterator iterator() {
return iterator;
}
private class ArrayListIterator implements Iterator {
int next = 0;
@Override
public boolean hasNext() {
return next < size;
}
@Override
public Object next() {
return elementData[next++];
}
}
}