2013-03-02 69 views
2

作業:請指引我幫助指導我沒有張貼Java:實現自己的鏈接LIst - >在哪裏定義hasNext(),next(),remove()?

我的教練是有我們實現一個LinkedList作爲家庭作業完成代碼。以下是該類外殼的標題:

public class LinkedList<T> implements Iterable<T>, Iterator<T> 

注意他正在實現Iterable和Iterator接口。然後我明白我需要在我的類中實現迭代器(),hasNext(),next()和remove()方法。但讓我困惑的是,他並沒有將Iterator接口所需的方法放在單獨的內部類中。以下所有方法在LinkedList類中定義:

/* 
* (non-Javadoc) 
* 
* @see java.lang.Iterable#iterator() 
*/ 
@Override 
public Iterator<T> iterator() 
{ 
    return null; 
} 

/* 
* (non-Javadoc) 
* 
* @see java.util.Iterator#hasNext() 
*/ 
@Override 
public boolean hasNext() 
{ 
    return false; 
} 

/* 
* (non-Javadoc) 
* 
* @see java.util.Iterator#next() 
*/ 
@Override 
public T next() 
{ 
    return null; 
} 

/* 
* (non-Javadoc) 
* 
* @see java.util.Iterator#remove() 
*/ 
@Override 
public void remove() 
{ 

} 

不應該iterator()方法來返回類似:

public Iterator<T> iterator() 
{ 
    return new MyClassIterator(front); 
} 

MyClassIterator()hasNext()next(),並確定remove()方法。我錯過了什麼?

+2

你是對的,這很混亂。集合通常不實現'Iterator'(迭代器)。你仍然可以在內部類中實現迭代器,並且只將'Iterator'方法委託給你的迭代器,即'hasNext()'將會是'return iterator()。hasNext();'但是'iterator()'方法應該按照你的建議更新。 – 2013-03-02 06:33:55

+0

這不僅令人困惑,這是明顯錯誤的,正如下面的@Patricia所解釋的。 – Flavio 2013-03-02 08:48:05

回答

5

這實在是一條評論,但必須作爲答案發布,因爲它太長而且難以在評論格式中閱讀。

要讓Iterable執行Iterator,請務必謹慎。可以有多個迭代器同時運行同一個Iterable。下面是一個說明該測試程序:

import java.util.Arrays; 
import java.util.Iterator; 
import java.util.List; 

public class Test { 
    public static void main(String[] args) { 
    List<String> myList = Arrays.asList(new String[] { "aaa", "bbb", "ccc" }); 
    Iterator<String> iter1 = myList.iterator(); 
    System.out.println("iter1: " + iter1.next()); 
    System.out.println("iter1: " + iter1.next()); 
    Iterator<String> iter2 = myList.iterator(); 
    for (String s; iter2.hasNext();) { 
     s = iter2.next(); 
     System.out.println("iter2: " + s); 
    } 
    System.out.println("iter1.hasNext(): " + iter1.hasNext()); 
    System.out.println("iter2.hasNext(): " + iter2.hasNext()); 
    System.out.println("iter1: " + iter1.next()); 
    } 
} 

它打印:

iter1: aaa 
iter1: bbb 
iter2: aaa 
iter2: bbb 
iter2: ccc 
iter1.hasNext(): true 
iter2.hasNext(): false 
iter1: ccc 

與具有Iterable實現Iterator是,你將最終獲得一個迭代器狀態都迭代器,推進風險iter2將影響iter1

當然,乾淨的解決方案是在您的Iterable實現中實現Iterator的私有類,併爲每個iterator()調用創建一個新實例。 iter1iter2然後引用不同的對象,並且更改爲iter2的狀態不會影響iter1

相關問題