2016-10-16 11 views
-1

私はJavaでBagの簡単な実装を書いています。私はIterableを実装しており、私自身のLinkedListイテレータを書いています。だから私は私の脳を揺らしている。リンクリストに要素を追加しようとしています。私は実際の実装(add()関数内のコメントアウトされたコード)を持っています。Java Iteratorの単独リンクリストの実装

current.item = item; 
Node<T> nextNode = new Node<T>(); 
current.next = nextNode; 
current = nextNode; 

だから、リストが空で、現在のヘッドが初期化されますが、何の項目または次のを持っていないことを考えると次のコードが動作しない理由しかし、私は理解していない私は、現在のアイテムにアイテムを割り当て、新しいノードを作成し、それを現在の次のノードに設定し、現在作成したノードに変更します。

現在::バッグ$ノードは、@ 4524411f次:バッグ$ノード401e7803

現在@:バッグ$ノード@ 401e7803リストに二つのアイテムを追加、私は後世のためのオブジェクトをプリントアウト次:バッグ$ノード@ 10dba097

現在:バッグ$ノード10dba097次の@:バッグ$ノード@ 1786f9d5

現在:バッグ$ノード@次1786f9d5:704d6e83

@バッグ$ノードには、次の各時間だけで罰金、新しいノードで設定取得していることを、少なくとも私には、はっきりと見えます。私は4つの要素すべてをバッグに追加しますが、アイテムは失われ、各インデックスに対してnullを返します。 toArray()関数は、[null, null, null, null]を表示します。

私は確信しています。以下は実装全体です。

import java.util.Iterator; 

public class Bag<T> implements Iterable<T> { 
    private Node current; 
    //Node<T> head; 
    private int numberofProducts; 
    T[] myBag; 
    int defaultCapacity; 

    public Iterator<T> iterator() { 
     return new ListIterator<T>(current); 
    } 

    public Bag(int defaultCapacity) { 
     this.current = new Node<T>(); 
     this.numberofProducts = 0; 
     this.defaultCapacity = defaultCapacity; 
    } 

    public void add(T item) { 
     if(isFull()) { 
      System.out.println("bags full, yo"); 
      return; 
     } 

     current.item = item; 
     Node<T> nextNode = new Node<T>(); 
     current.next = nextNode; 
     current = nextNode; 

     numberofProducts++; 

    //Node<T> nextNode = current; 
    //current = new Node<T>(); 
    //current.item = item; 
    //current.next = nextNode; 
    //numberofProducts++; 


    } 

    public Object[] toArray() { 
     Object[] array = new Object[size()]; 

     int i = 0; 
     Node<T> node = current; 
     //Node<T> node = head; 
     while(node.next != null) { 
      array[i] = node.item; 
      node = node.next; 
      i++; 
     } 

     return array; 
    } 

    public boolean isEmpty() { 
     return this.numberofProducts <= 0; 
    } 

    public boolean isFull() { 
     return this.numberofProducts >= defaultCapacity; 
    } 

    public int size() { 
     return this.numberofProducts; 
    } 

    private class Node<T> { 
     private T item; 
     private Node<T> next; 
    } 


    private class ListIterator<T> implements Iterator<T> { 

     private Node<T> current; 

     public ListIterator(Node<T> first) { 
      current = first; 
     } 

     public boolean hasNext() { 

      return current != null; 
     } 

     public T next() { 
      if(hasNext()) { 
       T item = current.item; 
       current = current.next; 
       return item; 
      } 
      return null; 
     } 

     public void remove() { 

     } 
    } 
} 
+0

でも、ポストを落とすのではなく(恐ろしい動き)、何か説明があるかもしれません。 – nbpeth

答えて

1

項目の値は失われません。問題は、あなたがリンクされたリストの頭のトラックを失うことです。 current変数はすでにテールを追跡しており、toArray()メソッドがcurrentで始まるので、リストの末尾要素の後ろに要素がないため、whileループは実行されません。

したがって、デフォルトで初期化されたObjectの値の配列、つまりnullになります。

これを修正するには、リストの先頭を追跡するために別のインスタンス変数が必要です。これはtoArray()メソッドで使用するものです。

+0

ポストを取り除きたいと思うほど簡単です。ありがとうございました - 私の頭は、リストの単純な論理の上に爆発して、私がおそらく欠けている可能性があるのか​​疑問に思っていました。 – nbpeth

1

私が見ることができるように、リンクされたリストとして機能していないのは、追加された最初の要素への参照を保持していないためです。むしろ最後の()要素への参照を保持します。あなたが最初の要素は、あなたのadd()方法に続いて T head

を追加したクラスのフィールド参照を追加することによってこの問題を解決することができます

、あなたが作成Nodeheadを設定します。 ListIteratorを構築するときは、パラメータとしてheadを渡します。

あなたはこのように表示するadd(T item)を変更することができます。

public void add(T item) { 
    if (!isFull()) { 
     Node<T> toAdd = new Node<>(); 
     toAdd.item = item; 
     current.next = toAdd; 
     current = toAdd; 
     if (head == null) { 
      head = toAdd; 
     } 
    } 
} 

次に、あなたのBag<T>クラスにクラスフィールドNode<T> headを追加します。

さらに、なぜNodeが静的​​クラスであるのかわかりませんが、私が今までに取り入れることのできない他の多くの変更がありましたが、私はそのクラスが現在不完全であると思います。

関連する問題