2016-03-23 8 views
2

クラスは完全ではありませんが、これまで私が持っていたことがあります。Java - カスタムイテレータがカスタムリンクリストの先頭を追跡できない

public class LinkedList<T> extends AbstractSequentialList<T> { 
    private Node<T> head; 

    @Override 
    public boolean add(T element) { 
    if(head == null) { 
     head = new Node(element); 
    } 
    return true; 
    } 

    @Override 
    public ListIterator<T> listIterator(int index) { 
    return new LinkedListIterator<>(); 
    } 

    @Override 
    public int size() { 
    return 0; 
    } 

    private class LinkedListIterator<T> implements ListIterator<T> { 
    private Node<T> current; 

    public LinkedListIterator() { 
     current = (Node<T>) head; 
    } 

    @Override 
    public boolean hasNext() { 
     return (current != null && current.getNext() != null)? true : false; 
    } 

    @Override 
    public T next() { 
     return null; 
    } 
    } 
} 

ここにNodeクラスがあります。

public class Node<T> { 

    private T value; 
    private Node next; 

    public Node(T value) { 
    this.value = value; 
    } 

    public Node(T value, Node next) { 
    this.value = value; 
    this.next = next; 
    } 

    public T getValue() { 
    return value; 
    } 

    public Node getNext() { 
     return next; 
    } 

    public void setNext(Node next) { 
     this.next = next; 
    } 
} 

イテレータのテストは、次のようなものです。

LinkedList<String> list; 
ListIterator<String> iterator; 

@Before 
public void setUp() throws Exception { 
    list = new LinkedList<>(); 
    iterator = list.listIterator(); 
} 

@Test 
public void testHasNext() throws Exception { 
    assertThat(iterator.hasNext(), is(false)); 

    list.add("Hello World"); 
    assertThat(iterator.hasNext(), is(true)); 
} 

しかし、私は2番目のアサーションには失敗しています。私の問題は、イテレータの "現在の"ポインタが、それを囲んでいるLinkedListクラスの先頭に設定していても、常にnullであることです。これをどうすれば解決できますか?ありがとう。

+0

getNext()は常にnullを返します。現在の!= null && current.getNext()!= null)は常にfalseです。 – JEY

+0

@JEY Nodeクラスのコードでポストを更新しました。デバッグするとき、私は実際には現在のnullを参照してください。 getNext()が呼び出される前に条件が既に失敗しました。 – user2017502

答えて

3

現在の値がLinkedListIteratorのコンストラクタ内に設定されているようです。

要素をリストに追加した後に更新されていません。これはあなたの問題のようです。

+0

私の経験から、すべてのケースで、イテレータが基礎となるデータ構造の変更を反映するとは期待しませんでした。私はいつも具体的な実装をチェックします。そこにソースコードで何も言及されていない場合は、私はソースを持っていない場合は、私は確かに知っている簡単なテストを設定するだろう。 – Fildor

1

あなたのテストは間違っています、IMO。

イテレータが構築された後にの後に最初の要素が追加された場合、イテレータが最初の要素を指すことを期待しないでください。

なぜ、イテレータはこのように動作しますか? Javaは値渡しであるためです。イテレータを構築すると、イテレータはリストの最初のノードへの参照のコピーを受け取ります。この時点では、まだノードを追加していないため、この参照はnullです。

リストの最初のノードを構成した後でも、その「イテレータ」を「参照」したい場合、イテレータはリストの最初のノードをコンストラクタではなくhasNext()にする必要があります。

+0

なぜこの回答が下落を知りたいのか分からない... – Fildor

関連する問題