可迭代是如何工作的



嘿,伙计们,我一直在自学java,我正在做这项作业。http://ljing.org/games/focus/

所以我从头开始写一个链表,我用LinkedList类写一个Deque类但是

关于类Iterator,只有一个问题我不明白。我只是不明白Class Deque迭代程序应该做什么。

此外,我的代码中有这个:

class Deque<Item> implements Iterable<Item>.

但编译器抱怨说,在我的Deque类中,我需要重写一个方法

@Override
public Iterator<Item> iterator()
{
    throw new UnsupportedOperationException("Not supported yet.");
}

但我不明白为什么

Java中有两个不同的用于迭代的重要接口,IterableIterator。它们各有不同的用途。

可迭代

当某个东西实现了这个接口时,这意味着它可以被迭代。这对我们很有用,因为Java为我们提供了一个快捷方式,可以使用for each循环来迭代实现Iterable的东西:

List<String> elements = ... ; // List is an instance of Iterable
for (String element : elements)
    System.out.println(element);

任何作为Iterable实例的东西都可以在for each循环中使用。如果您有自己的自定义MyDeque类来实现Iterable,那么您也可以在for each中使用它:

MyDeque<String> elements = ... ;
for (String element : elements)
    System.out.println(element);

这就把我们带到…

迭代器

这个接口就是实际执行迭代的方式。for each循环编译为如下内容:

MyDeque<String> elements = ... ;
for (Iterator<String> $iter = elements.iterator(); $iter.hasNext();) {
    String element = $iter.next();
    System.out.println(element);
}

这段代码在功能上等同于上述每一个的。hasNext()是延续条件(我有更多的东西要给你吗?)而next()实际上给了你下一个元素,或者如果我们没有其他东西的话,抛出一个NoSuchElementException

让您的自定义deque实现Iterable的目的只是让它可以使用类似for循环的东西来迭代deque中的元素。它的Iterator实现将让您真正执行迭代。

迭代器是一个用于访问集合中元素的概念。因为您说implements Iterable<Item>,所以您告诉编译器您提供了访问Deque元素的机制。但这还不够。除了声称你会这么做之外,你实际上必须这么做。在这种情况下,这么做就是实现方法。

如果你不这样做会发生什么:

因为您告诉编译器您将提供这个,所以您必须实现方法iterator(),它是这个访问概念的一部分。如果你不实现这个方法,编译器会抱怨,并告诉你"嘿,你说过你会实现的。所以信守诺言!"。

有两种方法可以解决这个问题:

1.)首先,不要说你会通过迭代器提供访问概念-删除implements Iterable<Item>

2.)信守诺言,执行方法。您必须为此编写一个自己的Iterator类。一旦你知道该做什么,这是一个相当短的任务。

相关内容

  • 没有找到相关文章

最新更新