2014-10-01 83 views
0

嘿,我一直在教自己的Java和我在做这个任务。 http://ljing.org/games/focus/迭代器如何工作?

因此,我从头开始编写链接列表,我使用LinkedList类写了一个Deque类 但是!

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

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

class Deque<Item> implements Iterable<Item>. 

但随后的编译器抱怨说,在我的Deque类需要重写的方法

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

但我不明白为什么

+1

当你实现一个接口时,你必须实现它的方法。你能澄清你在这方面的疑问吗? iteratior()应该每次调用它时都会返回一个新的迭代器。 – 2014-10-01 17:59:00

+1

您必须创建一个实现'Iterator '的实例并在iterator()方法中返回它。 – Eran 2014-10-01 17:59:03

+0

接口是一个'contract',它指定了一些方法及其行为。为了实现一个接口,你的类必须绑定到那个契约,并提供那些应该按预期工作的方法。 – SJuan76 2014-10-01 18:00:08

回答

0

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

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

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

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

1)首先,不要给你的话,你会通过迭代器提供接入的概念 - 删除implements Iterable<Item>

2)保持你的话,并实施该方法。你将不得不为此编写一个自己的Iterator类。一旦你知道该怎么做,这是一个相当短的任务。

+0

所以创建类Deque Iteraror的意义在于,我将在方法iterator()中创建它的一个实例? – Beto 2014-10-01 18:07:56

+0

是的。但Deque类不是最终目的。目的是在稍后当您在其他代码中使用Deque类时,可以使用迭代器概念来访问Deque中的元素。这使得编写使用Deque类的代码变得更简单。就像将代码复杂度从一个代码部分移到另一个代码部分,或者说从一个抽象层次到另一个代码部分一样。使用具有迭代器的集合类查找示例代码,您会更好地理解它,例如,前两个在http://javapapers.com/core-java/java-iterator/ – 2014-10-01 18:11:36

+0

得到了感谢兄弟。如果你有任何例子可以链接我吗?再次感谢 – Beto 2014-10-01 18:19:46

2

Java中有两个不同的接口用于迭代,它们很重要,IterableIterator。他们每个人都有不同的目的。

可迭代

当事情实现了这个接口,这意味着它可以重复的。

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

凡是是Iterable一个实例可以在for-each循环使用:因为Java提供了捷径,用于遍历东西使用for-each循环实现Iterable这对我们来说是有益的。如果你有自己的自定义​​类,它实现Iterable,那么你可以使用在换每个以及:

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实现是让你实际上那个迭代。