共同学习Java源代码-数据结构-PriorityQueue类(五)

    public Iterator<E> iterator() {
        return new Itr();
    }
这个是迭代器方法 

    private final class Itr implements Iterator<E> {

这个是实现了迭代器接口的内部迭代器类

        private int cursor = 0;

这个是迭代光标

        private int lastRet = -1;

这个是最近一次返回的元素在数组中的下标

        private ArrayDeque<E> forgetMeNot = null;

这个表示迭代过程中 一部分没有访问到的元素放在这里 等正常迭代完成 再迭代这里

        private E lastRetElt = null;

上一次访问的元素

        private int expectedModCount = modCount;
迭代器的修改次数 和 外部类的修改次数同步

        public boolean hasNext() {
            return cursor < size ||
                (forgetMeNot != null && !forgetMeNot.isEmpty());
        }
这个是判断是否还剩余元素的方法 判断光标是否小于size或forgetMeNot是否不为空

        @SuppressWarnings("unchecked")
        public E next() {
            if (expectedModCount != modCount)
                throw new ConcurrentModificationException();
            if (cursor < size)
                return (E) queue[lastRet = cursor++];
            if (forgetMeNot != null) {
                lastRet = -1;
                lastRetElt = forgetMeNot.poll();
                if (lastRetElt != null)
                    return lastRetElt;
            }
            throw new NoSuchElementException();
        }

这个是迭代下一个元素的方法

先判断如果两个修改次数不一致 就抛出并发异常 

判断如果光标小于size 就返回数组的下一个元素 光标自增后赋给lastRet 

判断如果forgetMeNot不为空

lastRet赋为-1 lastRetElt赋为forgetMeNot的第一个元素 并且从这个双向队列中删除第一个元素 判断这个元素不为空就返回

最后如果没有下一个元素了 就抛出异常

        public void remove() {
            if (expectedModCount != modCount)
                throw new ConcurrentModificationException();
            if (lastRet != -1) {
                E moved = PriorityQueue.this.removeAt(lastRet);
                lastRet = -1;
                if (moved == null)
                    cursor--;
                else {
                    if (forgetMeNot == null)
                        forgetMeNot = new ArrayDeque<>();
                    forgetMeNot.add(moved);
                }
            } else if (lastRetElt != null) {
                PriorityQueue.this.removeEq(lastRetElt);
                lastRetElt = null;
            } else {
                throw new IllegalStateException();
            }
            expectedModCount = modCount;
        }

    }

最后是迭代删除的方法

先判断两个修改次数是否一致 不一致就抛出并发异常

如果lastRet不为-1 说明队列还在遍历 就调用外部类的removeAt方法 将lastRet处的元素删除 并赋给临时变量moved

将lastRet设为-1

判断moved为空 光标自减 如果moved不为空 就判断forgetMeNot是否为空 为空就创建新的双向队列实例 将moved放进去 其实这个forgetMeNot就是个垃圾桶 

 如果lastRet为-1 单lastRetElt不为空 就调用外部类的方法删除这个对象 

如果上述判断都不成立就抛出异常

最后将两个修改次数统一

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值