嘿,伙计们,我一直在自学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中有两个不同的用于迭代的重要接口,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);
}
这段代码在功能上等同于上述每一个的。hasNext()
是延续条件(我有更多的东西要给你吗?)而next()
实际上给了你下一个元素,或者如果我们没有其他东西的话,抛出一个NoSuchElementException
。
让您的自定义deque实现Iterable
的目的只是让它可以使用类似for
循环的东西来迭代deque中的元素。它的Iterator
实现将让您真正执行迭代。
implements Iterable<Item>
,所以您告诉编译器您提供了访问Deque元素的机制。但这还不够。除了声称你会这么做之外,你实际上必须这么做。在这种情况下,这么做就是实现方法。
如果你不这样做会发生什么:
因为您告诉编译器您将提供这个,所以您必须实现方法iterator()
,它是这个访问概念的一部分。如果你不实现这个方法,编译器会抱怨,并告诉你"嘿,你说过你会实现的。所以信守诺言!"。
有两种方法可以解决这个问题:
1.)首先,不要说你会通过迭代器提供访问概念-删除implements Iterable<Item>
2.)信守诺言,执行方法。您必须为此编写一个自己的Iterator类。一旦你知道该做什么,这是一个相当短的任务。