如何使用Iterator返回特定元素

时间:2018-06-16 14:06:57

标签: java

我有这种迭代器。但我想只返回next()方法中的特定元素。在我的例子中,我想返回作为BagCoffee

实例的对象
@Override
    public Iterator<E> iterator() {
        return new Iterator<E>(){
            private Node<E> current = head;


            @Override
            public boolean hasNext()  {
                return current != null;             
            }
            @Override
            public void remove() {
                throw new UnsupportedOperationException();  
            }
            @Override
            public E next() {
                Coffee value = null;
                if (!hasNext()) throw new NoSuchElementException();
                if(!(current.value instanceof BagCoffee)) {
                        if(!hasNext()) {
                            current = current.next;
                            return next();
                        } else {
                            //Stop executing method?
                        }

                } else {
                    value = current.value;
                    current = current.next;
                }


                return (E) value;
            }
        };
    }

以下代码将打印我需要的内容,然后它将打印NullPointerException,因为它继续迭代,即使hasNext()返回false

for(Coffee coff: mySet3) {
            System.out.println("\n");
            coff.sayType();
        }

问题是如果下一个没有元素,我就无法停止方法。

if(!hasNext()) {
    current = current.next;
    return next();
} else {
    //Stop executing method
}

使迭代器返回特定元素并停止方法运行的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

主要问题是您错误地管理了迭代器的状态:current的值不应包含BagCoffee以外的任何内容。 如果是,则无法保证hasNext()合同方法得到尊重,因为即使下一个没有true,它也可以返回BagCoffee

因此,您应该在对象生命的两个不同时间通过以下方式确保此状态的正确性:

  1. 正确计算current的第一个值,使其为BagCoffee或null。
  2. 正确计算current的下一个值,使其为BagCoffee或null。
  3. 然后你最终可以重构以避免重复的代码。