package com.coding.basic;
import java.util.Arrays;
/**
* @Description 简单实现ArrayList
*/
public class SimpleArrayList implements SimpleList{
private int size = 0;
private Object[] elementData = new Object[10];
/**
* 插入元素o
* @param o 待插入元素
*/
public void add(Object o){
//扩容
if(elementData.length < size + 1){
grow(size+1);
}
elementData[size++] = o;
}
/**
* 数组扩容
* @param capacity 数组实际长度
*/
private void grow(int capacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//扩容50%
if(capacity > newCapacity){
newCapacity = capacity;
}
elementData = Arrays.copyOf(elementData, newCapacity);
}
/**
* 在指定索引初插入元素
* @param index 索引
* @param o 待插入元素
*/
public void add(int index,Object o){
rangeCheckForAdd(index);
if(elementData.length<size+1){
//扩容
grow(size+1);
}
elementData[index] = o;
size++;
}
/**
* 插入位置越界处理
* @param index 索引
*/
private void rangeCheckForAdd(int index) {
if(index > size || index <0){
throw new IndexOutOfBoundsException("数组越界异常");
}
}
/**
* 索引越界处理
* @param index 索引
*/
private void rangeCheck(int index) {
if(index >= size || index <0)
throw new IndexOutOfBoundsException("数组越界异常");
}
/**
* 移除该索引处元素
* @param index 索引位置
* @return 移除元素
*/
public Object remove(int index){
rangeCheck(index);
Object oldObject = elementData[index];
if(size > index +1){
System.arraycopy(elementData, index +1 , elementData, index, size-index-1);
}
elementData[--size] = null;
return oldObject;
}
/**
* 返回集合长度
* @return 长度
*/
public int size(){
return this.size;
}
/**
* 返回指定索引元素
* @param index 索引
* @return Object 元素
*/
public Object get(int index){
rangeCheck(index);
return elementData[index];
}
private class ArrayListIterator implements SimpleIterator{
SimpleArrayList l = null;
private int iteratorIndex = 0;
private ArrayListIterator(SimpleArrayList arrayList){
this.l = arrayList;
}
@Override
public boolean hasNext() {
return iteratorIndex < size;
}
@Override
public Object next() {
if (iteratorIndex >= size) {
throw new RuntimeException("数组越界异常");
}
return elementData[iteratorIndex++];
}
}
}