对于Iterator的每个循环,跳过第一个元素

时间:2017-09-23 11:58:53

标签: java iterator

对于学校,我必须制作一种像队列一样的链表。 我的节点有3个属性:

  • 节点左侧(节点左侧的节点)
  • 节点权限(节点的节点右侧)
  • 对象项(存储在列表中的对象)

我还必须使列表可迭代,以便实现接口。

我现在遇到的问题是,如果列表中有4个项目,则只显示3个项目。

因此,例如,如果列表中包含4个字符串,则' a',' b',' c'并且' d'输出是:

b
c
d

我的hasNext方法如下:

@Override
        public boolean hasNext() {
            return node.getRight() != null;
        }

我的下一个方法如下:

@Override
        public T next() {
            node = node.getRight();
            Object item = node.getItem();
            return (T)item;
        }

如果我返回节点的项而不是右边的节点,我得

a
b
c

作为回报,但这也不好,因为它会跳过最后一个。当你下次阅读API时,应该返回下一个值,所以我猜我的下一个方法必须保持原样。

2 个答案:

答案 0 :(得分:2)

迭代器的方法应该实现为:

@Override
public T next() {
    Object item = node.getItem();
    node = node.getRight();
    return (T)item;
}

@Override
public boolean hasNext() {
    return node != null;
}

想想其他迭代器。在第一次调用next()时,它们返回第一个元素,然后它们向前移动到第二个元素。当您指向最后一个元素时,next()应该返回它并向前移动(即指向null)。为了能够做到这一点,hasNext内的测试应该在当前项目上,而不是在下一个项目上,否则你无法获得最后一个元素。

答案 1 :(得分:0)

您可能通过将selectItem=-1 属性设置为第一个节点来初始化node属性,因此next()调用指向第二个节点。尝试检查第一个节点:

boolean first = true;

@Override public T next() { 
if (!first) {
node = node.getRight(); 
}
else 
first = false;
Object item = node.getItem();
return (T)item;
}