手写ArrayList

public class MyArrayList<E> implements Iterable<E> {  //迭代器接口
    //数组存储值
    private Object[] elementData;//大小
    private int size;

    public MyArrayList(int initialCapacity) {
        if (initialCapacity >= 0) {
            elementData = new Object[initialCapacity];
        } else {
            try {
                throw new MyException();
            } catch (MyException e) {
                e.printInit();
            }
        }
    }

    public MyArrayList() {
        this(0);
    }

    @SuppressWarnings("unchecked")
    private E elementData(int index) {
        return (E) elementData[index];
    }

    private void ensureCapacity() {
        if (size >= elementData.length) {
            elementData = Arrays.copyOf(elementData, size * 2 + 1);
        }
    }

    private void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            try {
                throw new MyException();
            } catch (MyException e) {
                e.printIndex();
            }
        }
    }
    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }

    public int indexOf(Object o) {
        for (int i = 0; i < size; ++i) {
            if (elementData[i].equals(o))
                return i;
        }
        return -1;
    }

    public E get(int index) {
        rangeCheck(index);
        return elementData(index);
    }

    public E set(int index, E element) {
        rangeCheck(index);
        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }

    public void add(E element) {
        ensureCapacity();
        elementData[size++] = element;
    }

    public void add(int index, E element) {
        rangeCheck(index);
        ensureCapacity();
        System.arraycopy(elementData, index, elementData, index + 1, size - index);
        elementData[index] = element;
        ++size;
    }

    public E remove(int index) {
        rangeCheck(index);
        E oldValue = elementData(index);
        System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
        elementData[--size] = null;
        return oldValue;
    }

    public boolean remove(E element) {
        for (int i = 0; i < size; ++i) {
            if (elementData[i].equals(element)) {
                remove(i);
                return true;
            }
        }
        return false;
    }

    //实现Iterable<E>接口的方法
    @Override
    public Iterator<E> iterator() {
        return new MyIter();
    }

    //内部类
    private class MyIter implements Iterator<E> {
        //计数器-->指针 游标
        private int cursor;
        private int lastRet = -1;

        //判断是否存在下一个
        @Override
        public boolean hasNext() {
            return cursor != size;
        }

        //返回游标当前位置,并把游标移到下一位置
        @SuppressWarnings("unchecked")
        @Override
        public E next() {
            if (!hasNext()) {
                try {
                    throw new MyException(8000,"系统内部错误");
                } catch (MyException e) {
                    e.printnext();
                }
            }
            lastRet = cursor;
            return (E) elementData[cursor++];
        }
    }

    public static void main(String[] args) {
        MyArrayList<String> list = new MyArrayList<String>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add(2, "123");
        list.remove("3445987");

        //使用迭代器遍历
        for (Iterator<String> itr = list.iterator(); itr.hasNext(); ) {
            System.out.println(itr.next());
            //itr.remove();
        }

        System.out.println("---------------------");

        //使用增强for循环遍历
        for (String str : list) {
            System.out.println(str);
        }
    }
}


class MyException extends Exception {

    private static final long serialVersionUID = 1L;

    private int errorCode;

    public MyException(int errorCode,String message) {
        super(message);
        this.errorCode = errorCode;
    }

    public MyException() {
        System.out.print("出现异常:");
    }

    public void printIndex() {
        System.out.println("索引范围越界!");
        System.exit(1);
    }

    public void printInit() {
        System.out.println("请重新初始化");
    }

    public void printnext() {
        System.out.println("游标越界!");
        System.exit(1);
    }

    public void printremove() {
        System.out.println("remove()只有在执行完next()后才能且只能执行一次!");
        System.exit(1);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值