2017-03-05 2 views
0

私はカスタムリンクリストを作成しました。また、私はiteratorを作りました。しかし、私が理解しているように、プログラムはメソッドsize()でループしていません。どうしたの?それは私の不正確なループかiterator()についてですか?すべてのノードにフィールドがあります:nextIndexprevIndexvalueリンクリストのカスタムイテレータ

public class CustomLinkedList<E> implements List<E>{ 
    private ListNode<E> header = new ListNode<>(); 

    public CustomLinkedList() { 
     this.header = new ListNode(); 
    } 

    @Override 
    public int size() { 
     int size = 0; 
     for(E it : this) { 
      size++; 
     } 
     return size; 
    } 

    @Override 
    public boolean isEmpty() { 
     if(this.header == null){ 
      return true; 
     } else {return false;} 
    } 

    @Override 
    public boolean contains(Object o) { 
     if(((Integer) header.getValue() == 42) && ((Integer) header.getNextIndex().getValue() == 38)) return true; 
     return false; 
    } 

    @Override 
    public Iterator<E> iterator() { 
     return new Iterator<E>() { 
      private ListNode it = header; 

      @Override 
      public boolean hasNext() { 
       return (it.getNextIndex() != header) && (it.getNextIndex() != null); 
      } 

      @Override 
      public E next() { 
       it = it.getNextIndex(); 
       return (E) it.getValue(); 
      } 

      @Override 
      public void remove() 
      { 
       throw new UnsupportedOperationException("Iterator is read-only"); 
      } 
     }; 
    } 


    @Override 
    public boolean add(E e) { 
     ListNode<E> temp = new ListNode<>(); 
     temp.setValue(e); 
     if (this.size() < 1) { 
      header.setValue(e); 
      header.setPrevIndex(header); 
      header.setNextIndex(header); 
     } else { 
      temp.setNextIndex(header); 
      ListNode tempLast = header.getPrevIndex(); 
      tempLast.setNextIndex(temp); 
      header.setPrevIndex(temp); 
      temp.setPrevIndex(tempLast); 
     } 
     return true; 
    } 

    @Override 
    public boolean remove(Object o) { 
     return true; 
    } 

    @Override 
    public boolean containsAll(Collection<?> c) { 
     throw new NotImplementedException(); 
    } 

    @Override 
    public void clear() { 
     throw new NotImplementedException(); 
    } 

    @Override 
    public E get(int index) { 
     throw new NotImplementedException(); 
    } 

    @Override 
    public int indexOf(Object o) { 
     throw new NotImplementedException(); 
    } 

    @Override 
    public boolean addAll(Collection<? extends E> c) { 
     throw new NotImplementedException(); 
    } 
} 

答えて

1

あなたは一度add(E e)を呼び出すその後header.getNextIndex() == nullで始まります。 add()インサイド 、size()はあなたがアドオン(),サイズ()will callのhasNext()ので it.getNextIndex() == headerのでを返しますandのhasNext()will check (it.getNextIndex() != header) && (it.getNextIndex() != null). Inside再びadd(E e)を呼び出しheader.setPrevIndex(header)header.setNextIndex(header)

に次を設定するので、0を返します。 size()は常に1未満です

あなたのコードには他にもたくさんのバグがあります。より良い部分実装は次のようなものになります

public class CustomLinkedList<E> implements List<E> { 

    private ListNode<E> header; 

    public CustomLinkedList() { 
     this.header = null; 
    } 

    @Override 
    public int size() { 
     int size = 0; 
     for (E it : this) 
      size++; 
     return size; 
    } 

    @Override 
    public boolean isEmpty() { 
     return header == null; 
    } 

    @Override 
    public boolean contains(Object obj) { 
     if (header != null) 
      for (E it : this) 
       if (it.equals(obj)) 
        return true; 
     return false; 
    } 

    @Override 
    public Iterator<E> iterator() { 
     return new Iterator<E>() { 
      private ListNode<E> it = null; 

      @Override 
      public boolean hasNext() { 
       if (it==null && header!=null) 
        return true; 
       else if (it != null) 
        return it.getNextIndex() != null; 
       else 
        return false; 
      } 

      @Override 
      public E next() { 
       if (it==null) 
        it = header; 
       else 
        it = it.getNextIndex(); 
       return it.getValue(); 
      } 

      @Override 
      public void remove() { 
       throw new UnsupportedOperationException("Iterator is read-only"); 
      } 
     }; 
    } 

    @Override 
    public boolean add(E e) { 
     ListNode<E> temp = new ListNode<>(); 
     temp.setValue(e); 
     if (header == null) { 
      header = temp; 
     } else { 
      ListNode<E> it = header; 
      while (it.getNextIndex() != null) 
       it = it.getNextIndex(); 
      temp.setPrevIndex(it); 
      it.setNextIndex(temp); 
     } 
     return true; 
    } 

} 
+0

どのように最初の反復でheader.valueを取得するために改善するのですか?今それはしません。最初の反復でheader.getNextIndex()。getValue()を取得するためです。 – Russiancold

+1

ええ、あなたは正しいです。私はhasNext()とその初期化でコードを編集しましたが、それをテストしませんでした。今はOKだと思います。 –

+0

ありがとうございました。 – Russiancold

0

あなたは例えば、要素をループするiteratorhasNextnextメソッドを使用してサイズをインクリメントする必要があります。:

@Override 
public int size() { 
    int size = 0; 
    for(Iterator<String> it = this.iterator(); it.hasNext(); it.next()){ 
     size++; 
    } 
    return size; 
} 
+0

まだループの中には入りません。だから問題は、誤った追加かhasNext()です。右? – Russiancold

+0

ループ内に入っていなければ、あなたのリストは空である可能性が高いです。 –

+0

'add()'メソッドが間違っているので、ループの中に入りません。私の説明を読んで、なぜ別の答えになるのか。 –

関連する問題