package com.coding.basic.array;
import java.util.NoSuchElementException;
import com.coding.basic.Iterator;
import com.coding.basic.List;
public class ArrayList<E> implements List<E> {
private int size = 0;
/*扩容因子*/
private static final int GENE = 10;
private Object[] elementData = new Object[10];
/*扩容引用*/
private Object[] newElementData;
public void add(E o){
grow();
elementData[size] = o;
size ++;
}
public void add(int index, E o){
if(index<0||index>size){
throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size);
}
grow();
if(index<size){//长度足够需要移动
newElementData = new Object[elementData.length];
System.arraycopy(elementData, 0, newElementData, 0, index);
System.arraycopy(elementData, index, newElementData, index+1, size-index);
elementData = newElementData;
}
elementData[index] = o;
size ++;
}
public E get(int index){
rangeCheck(index);
return elementData(index);
}
public E remove(int index){
rangeCheck(index);
E o = elementData(index);
int i = this.size - index - 1;
if (i > 0) {
System.arraycopy(this.elementData, index + 1, this.elementData, index, i);
}
this.elementData[(--this.size)] = null;
return o;
}
public int size(){
return size;
}
public Object[] toArray(){
Object[] objArr = new Object[size];
System.arraycopy(elementData, 0, objArr, 0, size);
return objArr;
}
@Override
public String toString() {
StringBuilder str = new StringBuilder();
str.append("[");
for (int i = 0; i < size; i++) {
str.append(elementData[i].toString()+",");
}
return str.toString().substring(0, str.length()-1)+"]";
}
/**
* 扩容,扩容因子为10
*/
private void grow(){
if(size>=elementData.length){//长度不够需要扩容
newElementData = new Object[size+GENE];
System.arraycopy(elementData, 0, newElementData, 0, elementData.length);
elementData = newElementData;
}
}
private void rangeCheck(int index) {
if (index >= this.size) {
throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size);
}
}
@SuppressWarnings("unchecked")
E elementData(int index) {
return (E) elementData[index];
}
public Iterator iterator(){
return new Itr();
}
private class Itr implements Iterator{
int cursor;
@Override
public boolean hasNext() {
return cursor != ArrayList.this.size;
}
@Override
public Object next() {
int i = this.cursor;
if (i >= ArrayList.this.size){
throw new NoSuchElementException();
}
this.cursor = (i + 1);
return ArrayList.this.elementData[i];
}
}
}