2011-12-21 17 views
2

主な質問: 私はそれが(効率的に)から自分自身を削除することができるようにLinkedListの内、リスト内の自分自身への参照をオブジェクトを与えるためにいくつかの方法を模索していますが、リストには、自分自身を探してリストをソートしないと(言いました。リストから直接切り離して、前後のアイテムをつなぎ合わせるだけです)。オブジェクトをJavaのLinkedListから削除する方法を教えてください。

あまり必要な詳細:私はグーグルの合理的な金額を行われ、循環参照を使用しないように助言する人以外のものを見つけていませんでした

私はゲームをデザインしていますが、ゲームオブジェクトにはさまざまなインターフェイスを実装して、優先順位を付けてさまざまなリストに入れることができます。 1つのオブジェクトがドロー・ループ、そのアニメーションのフレーム、優先度の高いロジック・ループ、および低優先度のロジック・ループを同時に通過するループである可能性があります。私は、removeFrom | TypeOfLoop |を実装したいと思います。メソッドを呼び出すことで、オブジェクトがもはやループ内にある必要がないと判断した場合、オブジェクトはそれ自身を直接削除することができます。これにより、実際のループを行うオブジェクトが楽に簡単に保たれます。

また、これを行う方法がない場合、リスト内で項目内の変数に基づいて各項目を削除したいかどうかを確認するフラグシステムを実装することを考えています。しかし、私はこれをやって、リファレンスで取り除くことができる自分自身のLinkedListを作ることができると思うのは嫌です。

答えて

3

私は最近これを行いました。私はO(1)を追加するためにO(1)を探していました。ロックフリーのCollectionを削除しました。最終的に私は自分自身でRingと書いていました。固定サイズのコンテナが必要だったからです。

私は私の前にコードを持っていないが、メモリが提供する場合:Nodeクラスを公開

  1. Concurrent Doubly LinkedList優れたDoug Lea年代のコピーを取ると。私はinterfaceを使用しましたが、それはあなた次第です。

  2. 変更の代わりbooleanNodeを返すためにaddoffer ...メソッド。 これはもはやJavaのCollectionではなく、後で私のコメントを参照してください。

  3. Nodeクラスのdeleteメソッドを公開するかNodeを取るremoveメソッドを追加します。

あなたは今O(1)時間内のリストから要素を削除することができ、そしてそれはロックフリーです。

を追加しました

ここで彼のIterator実装から取らremove(Node)メソッドの実装です。成功するまで試し続けなければならないことに注意してください。あなたの要素を見つけたときに、それを反復してiterator.removeを()を実行するよりも、

public void remove(Node<E> n) { 
    while (!n.delete() && !n.isDeleted()) 
    ; 
} 
+0

ええと、あなたのオブジェクトは、ノードが追加された後でそのノードへの参照を保持する必要があると思います。それでも循環参照が導入されますが、実際にはO(1)の削除時間があります。 私は好きです! – greyfairer

+0

これは完璧に見える!本当にありがとう。 – Casey

+0

ハックするのではなく 'Node'を返す独自の' add'と 'offer'メソッドを追加することで' Collection'を保つことができます。おそらく 'nAdd'と' nOffer'です。 – OldCurmudgeon

0

あなたの選択肢は、アイテムがループから自分自身を削除するよりもはるかに良いと思います。これは、リスト内のオブジェクトの責任を軽減し、循環参照を回避します。

また、GuavaのIterables.filter()メソッドを使用して、繰り返し処理ごとにオブジェクトをレンダリングするかどうかを明示的にチェックするのではなく、フィルタリングされたリストを反復処理できます。

あなたがしたいことが可能であったとしても、反復処理中にリストからオブジェクトを削除すると、ConcurrentModificationExceptionが発生します。それを行う唯一の方法は、現在のオブジェクトをイテレータから削除することです。

0

あなたはLinkedListのを使用している場合は、項目を削除するには、no、より効率的な方法はありません。

は、Googleのコレクションやグアバを使用している場合、あなたはonelinerでそれを行うことができます。

Iterables.removeIf(list.iterator(), Predicates.equalTo(this)); 
0

最も簡単な方法は、リストのオブジェクトを反復処理し、Iterator.removeを使用するようにIteratorを使用するようにアルゴリズムを変更することになります()メソッドを使用して現在の要素を削除します。

関連する問題