package task1.basic; import java.util.Arrays; import java.util.NoSuchElementException; import java.util.Objects; /** * Created by wanc on 2017/2/21. * 实现ArrayList */ public class WArrayList implements WList { /** * 实例化空数组 不用每次都new */ private static final Object[] Empty_elementData = {}; /** * 计数 */ private int size = 0; /** * 数据存放 */ private Object[] elementData = new Object[100]; public WArrayList() { this.elementData = Empty_elementData; } public WArrayList(Object[] c) { size = c.length; this.elementData = c; } /** * 检查是否越界 */ private void checkLenght(int index) { if (index - size > 0) throw new IndexOutOfBoundsException(); } /** * 增加数组容量 */ private void kuorong() { elementData = Arrays.copyOf(elementData, size + 1); } /** * 添加数据 * * @param o */ public void add(Object o) { //扩容 kuorong(); //添加数据 elementData[size++] = o; } /** * 在指定索引添加数据 * * @param index * @param o */ public void add(int index, Object o) { //扩容 kuorong(); //移动数据 System.arraycopy(elementData, index, elementData, index + 1, size - index); //添加数据 elementData[index] = o; size++; } /** * 获取指定索引数据 * * @param index * @return */ public Object get(int index) { //检查是否越界 checkLenght(index); return elementData[index]; } /** * 移除指定索引数据 * * @param index * @return */ public Object remove(int index) { //检查是否越界 checkLenght(index); Object element = elementData[index]; //计算移除该元素后,要前移的个数 int movesize = size - index - 1; //移动数据 System.arraycopy(elementData, index + 1, elementData, index, movesize); //删除末尾元素 elementData[--size] = null; return element; } /** * 返回数量 * * @return */ public int size() { return size; } public boolean contaions(Object o) { if (size==0)return false; for (int i = 0; i < size; i++) { if (Objects.equals(o, elementData[i])) return true; } return false; } /** * 获取迭代器 * * @return */ public WIterator iterator() { return new ArrayItr(); } //迭代器实现类部类 private class ArrayItr implements WIterator { int cursor;//游标 @Override public boolean hasNext() { return cursor != size; } @Override public Object next() { int i = cursor; if (i > size) throw new NoSuchElementException(); Object[] newElementData = WArrayList.this.elementData; if (i > newElementData.length) throw new IndexOutOfBoundsException(); cursor = i + 1; return newElementData[i]; } } /** * 重写toString 方便打印 * * @return */ @Override public String toString() { Object[] s = Arrays.copyOf(elementData, size); return Arrays.toString(s); } }