私は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() {
}
}
}
でも、ポストを落とすのではなく(恐ろしい動き)、何か説明があるかもしれません。 – nbpeth