package com.aaront.exercise.generic;
import java.util.Arrays;
public class GenericArrayList<T> implements GenericList<T> {
private int size = 0;
private static final double factor = 0.75;
private Object[] elementData = new Object[100];
public void add(T o) {
_ensureCapacityEnough();
elementData[size++] = o;
}
public void add(int index, T o) {
if (index < 0 || index > size) throw new IndexOutOfBoundsException("index超出边界");
_ensureCapacityEnough();
int i = size;
for (; i > index; i--) {
elementData[i] = elementData[i - 1];
}
elementData[i] = o;
size++;
}
private void _ensureCapacityEnough() {
if (size >= elementData.length) {
dilatancy();
}
}
private void dilatancy() {
int newLength = elementData.length + (int) (elementData.length * factor);
elementData = Arrays.copyOf(elementData, newLength);
}
public T get(int index) {
if(index < 0 || index >= size) throw new IndexOutOfBoundsException("index超出边界");
return (T) elementData[index];
}
public T remove(int index) {
if (index < 0 || index >= size) throw new IndexOutOfBoundsException("index超出边界");
Object element = elementData[index];
System.arraycopy(elementData, index + 1, elementData, index, size - 1 - index);
size--;
return (T) element;
}
public int size() {
return size;
}
public GenericIterator<T> iterator() {
return new ArrayListGenericIterator(this);
}
public Object[] toArray() {
Object[] objects = new Object[size];
System.arraycopy(elementData, 0, objects, 0, size);
return objects;
}
public T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
return a;
}
private static class ArrayListGenericIterator<T> implements GenericIterator<T> {
private GenericArrayList<T> genericArrayList;
private int pos = 0;
private ArrayListGenericIterator(GenericArrayList<T> genericArrayList) {
this.genericArrayList = genericArrayList;
}
public boolean hasNext() {
return pos < genericArrayList.size();
}
public T next() {
return (T) genericArrayList.elementData[pos++];
}
public void remove() {
genericArrayList.remove(pos - 1);
pos--;
}
}
}