嘿伙计们,我一直在教自己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.");
}
但我不明白为什么
答案 0 :(得分:2)
Java中有两个不同的迭代接口,重要的是Iterable
和Iterator
。它们各自用于不同的目的。
<强>可迭代强>
当某些东西实现此接口时,这意味着它可以被迭代。这对我们很有用,因为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类。一旦你知道该怎么做,这是一个相当短的任务。