package com.coding.basic;
public class ArrayList implements List {
private int size = 0;
private Object[] elementData = new Object[10];
public void add(Object o){
if(size < this.elementData.length){//加至末尾,size+1
this.elementData[size] = o;
size++;
}else{//扩张数组,然后加至末尾,size+1
this.elementData = grow(this.elementData,10);
this.elementData[size] = o;
size++;
}
}
public void add(int index, Object o){//-1<index<size+1 or 0=<index<=size
if(index < 0 || index > this.size){//index小于0or大于size,参数错误
return;
}
if(size >= this.elementData.length){//当前数组容量已满,需扩张
this.elementData = grow(this.elementData, 10);
}
//此时只需考虑将o加至index处(0=<index<=size && size<length)
if(index < size){//移动数据,然后插入o,size+1
for(int i = size;i > index;i--){
this.elementData[i] = this.elementData[i-1];
}
this.elementData[index] = o;
this.size++;
}else{//直接插入o,size+1
this.elementData[index] = o;
this.size++;
}
}
public Object get(int index){//-1<index<size or 0=<index<size
if(index < 0 || index >= this.size){//index小于0or大于等于size,参数错误
return null;
}
return this.elementData[index];
}
public Object remove(int index){//-1<index<size or 0=<index<size
if(index < 0 || index >= this.size){//index小于0or大于等于size,参数错误
return null;
}
Object o = this.elementData[index];//o保存被移除的值
//此时只需考虑将index处的o移除
for(int i = index;i < this.size-1;i++){
this.elementData[i] = this.elementData[i+1];
}
this.size--;
return o;
}
public int size(){
return this.size;
}
public Iterator iterator(){
return new ArrayListIterator(this);
}
public static class ArrayListIterator implements Iterator{
private ArrayList list;
private int pres;
public ArrayListIterator(ArrayList list) {
super();
this.list = list;
this.pres = 0;
}
@Override
public boolean hasNext() {
if(this.pres < this.list.size()){
return true;
}else{
return false;
}
}
@Override
public Object next() {
Object o = this.list.get(this.pres);
this.pres++;
return o;
}
}
/*
* 说明:扩张数组
* 参数:被扩张的原数组,扩张的增加数(扩张后数组的大小为原数组的长度+增加数)
* 返回值:扩张后的数组
*/
private static Object[] grow(Object[] src,int size){
// return Arrays.copyOf(src, src.length + size);
Object[] target = new Object[src.length + size];
System.arraycopy(src, 0, target, 0, src.length);
return target;
}
public String toString(){
String result = "[";
if(this.size == 0){
result = result + "]";
return result;
}else{
for(int i = 0;i < size;i++){
result = result + this.elementData[i] + ",";
}
result = result.substring(0,result.length()-1);
result = result + "]";
return result;
}
}
}