2014-10-01 90 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實現是讓你實際上那個迭代。