可迭代如何工作?

时间:2014-10-01 17:57:20

标签: java data-structures linked-list iterator deque

嘿伙计们,我一直在教自己java和我正在完成这项任务。 http://ljing.org/games/focus/

所以我从头开始编写一个Linked列表,我使用LinkedList类编写一个Deque类 但是!

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

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

class Deque<Item> implements Iterable<Item>.

然后编译器抱怨我的Deque类中我需要覆盖一个方法

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

但我不明白为什么

2 个答案:

答案 0 :(得分:2)

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);
}

这段代码在功能上等同于上面的for-each。 hasNext()是延续条件(我有更多东西可以提供给你吗?)next()实际上为你提供了下一个元素,如果我们没有其他内容,则会抛出NoSuchElementException

制作自定义双端实现工具Iterable的目的只是为了让你可以使用像for循环这样的东西迭代你的双端队列中的元素。它的Iterator实现可以让你实际那次迭代。

答案 1 :(得分:0)

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

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

因为你告诉编译器你会提供这个,所以你必须实现方法iterator(),这是这个访问概念的一部分。如果你没有实现这个方法,编译器会抱怨并告诉你“嘿,你说你会这样做。所以请保守!”。

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

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

2。)保守信息并实施方法。你必须为此编写一个自己的Iterator类。一旦你知道该怎么做,这是一个相当短的任务。