2011-10-30 11 views
0
public void traverse(Node root){ 
    ArrayDeque<Node> queue = new ArrayDeque<Node>(); 
     queue.add(root); 

    while(!queue.isEmpty()){ 
     Node currentNode = queue.pollFirst(); 
     List<Node> nl = getChildrenfromDB(currentNode); 
     queue.addAll(nl); 
    } 

ArrayDequeまたはLinkedListまたはLinkedBlockingDequeを使用する必要がありますか? int値10を設定するとどうなりますか?これはキューが一度に10個しか保持しないことを意味しますか? DBのサイズから取得したコレクションが10より大きい場合はどうなりますか?このバインドされた値は、キューの「スナップショット」を定義していますか?java:ArrayDequeまたはLinkedListまたはLinkedBlockingDequeを使用した非再帰的な深さの最初の検索?

public void traverse(Node root){ 
    LinkedBlockingDeque<Node> queue = new LinkedBlockingDeque<Node>(10); 
     queue.add(root); 

    while(!queue.isEmpty()){ 
     Node currentNode = queue.pollFirst(); 
     List<Node> nl = getChildrenfromDB(currentNode); 
     queue.addAll(nl); 
    } 
+0

前にコードを追加してください。キューの場合、これはあまり難しくありません。 –

+0

'List.addAll(int index、Collection c)'についてはどうですか? – blackcompe

答えて

1

ArrayListを使用しないでください - Dequeインタフェースの実装の1つを使用します。たとえば、この種のために設計されたLinkedBlockingDequeを使用します。必要に応じてaddFirst(),addLast(),pollFirst()、およびpollLast()の方法を使用してください。

何らかの理由で、あなたが本当にLinkedListを使用し、Listを使用する必要がある、場合 - すべての要素を移動する必要があるようArrayListの前に追加するには、非常に非効率的です。

1

あなたはArrayList

公共ボイド追加(int型のインデックス、Eの要素)

挿入し、このリストの指定された位置に指定された要素のJavadocを読むことができました。現在その位置にある要素(存在する場合)とそれに続く要素を右にシフトします(インデックスに1を加えます)。

queue.add(0,myObject); 

のJavaDocは、あなたの友人です。

言われているように、他の人が言及したように。使用する最良のデータ構造ではありません。リストへのランダムアクセスを必要としない場合は、LinkedListまたはArrayDequeがより効率的です。

0

なぜスタックを使用しないのですか。スタックはDFSに行く方法です。 Stackが問題を解決する理由については、thisの記事を参照してください。この便利なtutorialも参照してください:)

+0

私はそれを使用しましたが、それは多くのメモリを使います。 – KJW

関連する問題