【问题标题】:Java Iterable object won't Iterate correctlyJava Iterable 对象无法正确迭代
【发布时间】:2014-11-10 21:36:47
【问题描述】:

我有一个实现 Iterable 接口的 java 对象。这个链表有一组对象,每个对象都包含一个参数化对象(所以它可以是字符串或数组列表或其他)。

在 iterator() 方法中,我创建了一个 Iterator 对象,该对象接受这些参数化项的数组并返回它。

但是,当我使用以下代码时:

//create an Iterable object named 'iterate'
for(String current : iterate){
//try to do some stuff with it... print it out?
}

//more code

//这里是我如何实现我的Iterable类的迭代器函数:

public Iterator<Item> iterator(){
   // return an iterator over items in order from front to end
    Item[] items = (Item[]) new Object[numberOfItems];
    QueueItem<Item> item = first;
    for(int i=0;i<numberOfItems;i++){
        items[i] = item.getInfo();
        item = item.next;
    }
    return new myIterator(items);
}

//here is the code for the myIterator class. it is a private internal class

private class myIterator implements Iterator<Item>{

    Item items[];
    int index;
    public myIterator(Item current[]){
        items = current;
        index = 0;
    }
    @Override
    public boolean hasNext() {
        if(items==null){
            return false;
        }
        return (index>=items.length);
    }

    @Override
    public Item next() {
        if(index+1>=items.length){
            throw new NoSuchElementException("There are no more elements!");
        }
        return items[index++];
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException("this operation is not supported");
    }

}

代码进入 for 循环,然后正确创建 Iterator 对象(我使用断点确认)并返回它,但随后代码跳出 for 循环,甚至没有经过一次并继续...... .

我错过了什么吗?我在这里做错了吗?我需要如何更改我的 Iterable 对象的实现?是否有一些我没有考虑到的实现这一点的 GOTCHA?

谢谢!

【问题讨论】:

  • 展示你如何实现新的迭代器实例
  • 你必须展示一些真实的代码才能有一个有效的问题。
  • 我添加了上面的代码。我添加了我认为相关的内容。如果您需要更多信息,请告诉我......
  • 也许 numberOfItems 等于 0 ?
  • 不是这样的。我在迭代器构造代码中放置了一个断点。它通过并获得正确的数组,这正是我想要的。但是,foreach 构造对它没有任何作用!

标签: java iterable


【解决方案1】:

天哪。好尴尬。 hasNext 方法反转了布尔语句。

应该是:

return (index<items.length); thanks anyways! 

我一直在为此烦恼。我调试了其他所有东西,然后我就明白了。

这是我的第一个迭代器实现,所以我认为它一定是我没有正确执行的更基本的东西。

【讨论】:

  • 不要写一个与已经发布的答案相同的新答案,您应该投票/接受第一个答案。
  • 对不起。当我回到这个线程时,答案不存在。我为后代留下了我的答案,而不是一定要接受我自己的答案。我不是那种自大狂!感谢您的反馈。
【解决方案2】:

hasNext 方法中检查return (index&gt;=items.length); 是否会返回false。将操作符更改为"&lt;"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多