package com.zhaogd.array;
import com.zhaogd.collection.Iterator;
import com.zhaogd.collection.List;
import java.util.Arrays;
public class ArrayList implements List {
private int size = 0;
private Object[] elementData = new Object[100];
/**
* 按下标顺序新增元素
*
* @Method add
* @param o
*/
public void add(Object o) {
ensureCapacityInternal(size + 1);
elementData[size] = o;
size++;
}
/**
* 在指定下标位置插入元素
*
* @Method add
* @param index
* @param o
*/
public void add(int index, Object o) {
checkRangeForAdd(index);
ensureCapacityInternal(size + 1);
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = o;
size++;
}
/**
* 根据下标获取列表数据
*
* @Method get
* @param index
* @return
*/
public Object get(int index) {
checkRangeForGetOrRemove(index);
return elementData[index];
}
/**
* 根据下标移除元素,并返回移除的元素值
*
* @Method remove
* @param index
* @return
*/
public Object remove(int index) {
checkRangeForGetOrRemove(index);
Object oldValue = elementData[index];
System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
size--;
elementData[size] = null;
return oldValue;
}
/**
* 获得列表长度
*
* @Method size
* @return
*/
public int size() {
return size;
}
/**
* 获取ArrayList的迭代器
*
* @MethodName iterator
* @author zhaogd
* @date 2017年2月21日 下午8:19:28
* @return
*/
public Iterator iterator() {
return new ArrayListIterator();
}
/**
* 确保数组容量足够,如果不够则扩充数组
*
* @MethodName ensureCapacityInternal
* @author zhaogd
* @date 2017年2月21日 下午5:06:46
* @param minCapacity
*/
private void ensureCapacityInternal(int minCapacity) {
if (minCapacity > elementData.length) {
grow(minCapacity);
}
}
/**
* 数组扩充,每次扩充原数组一半的长度,然后把原数组拷贝到新数组
*
* @MethodName grow
* @author zhaogd
* @date 2017年2月21日 下午5:20:55
* @param minCapacity
*/
private void grow(int minCapacity) {
minCapacity = elementData.length + elementData.length / 2;
elementData = Arrays.copyOf(elementData, minCapacity);
}
/**
* 检查Add方法的下标范围是否合法
*
* @MethodName checkRangeForAdd
* @author zhaogd
* @date 2017年2月21日 下午7:32:55
* @param index
*/
private void checkRangeForAdd(int index) {
if (index > size || index < 0) {
throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size);
}
}
/**
* 检查Get或者Remove方法的下标范围是否合法
*
* @MethodName checkRangeForGetOrRemove
* @author zhaogd
* @date 2017年2月21日 下午7:33:21
* @param index
*/
private void checkRangeForGetOrRemove(int index) {
if (index >= size || index < 0) {
throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size);
}
}
private class ArrayListIterator implements Iterator {
private int lastIndex = 0;
@Override
public boolean hasNext() {
return lastIndex < size;
}
@Override
public Object next() {
return elementData[lastIndex++];
}
}
}