5

PriorityQueueJavaの の順序がわかりません。私が理解しているように、それらはヒープベースであり、挿入順序として正確な反復順序を提供できません。次に、どのような基準に基づいてpriorityQueueをソートするかを知りたいです。与えられたコード:

PriorityQueue<String> pq = new PriorityQueue<String>();
        pq.offer("hepqo");
        pq.offer("bro");
        pq.offer("wassup");
        pq.offer("okay");
        pq.offer("bingo");
        pq.offer("first");
        pq.offer("last");
        pq.offer("ssup");
        System.out.println("polled "+pq.poll());
        System.out.println(pq);
        String str[] = pq.toArray(new String[0]);
        Arrays.sort(str);
        for(String str1:str){
            System.out.println(str1);
        }

出力を生成します:

polledbingo
[bro, hepqo, first, okay, ssup, wassup, last]
bro
first
hepqo
last
okay
ssup
wassup

配列に変換しても順序が崩れます。
これが文字列によるNATURAL ORDERINGでさえ感じられない。
優先キューの挿入順序を維持する方法はありますか?
彼らは何に基づいて分類したのですか?

4

2 に答える 2

3

キューは文字列の辞書式順序に従ってソートされます。これは自然な順序です (つまり、'b' は 'f' の前に、'f' は 'h' の前に、など)。キューで挿入順序を維持したい場合は、Queue代わりにバニラを使用してくださいPriorityQueue

于 2013-07-16T22:42:32.573 に答える
-1

Java のプライオリティ キューは、ヒープ(抽象的なデータ構造)と呼ばれるものの実装です。ヒープのデータ構造を見ると、キー (または Java 用語ではコレクション要素) 間の厳密な順序付けの原則はありません。ヒープ ADT は、主に、最初の要素 (ヒープの場合はルートになります) の高速な挿入/削除と O(K) 時間の取得に役立ちます。そのため、すべての要素の検索、要素の並べ替え、または要素のトラバースに、Java で PriorityQueue データ構造を使用しないでください。それらの目的のためのものではないからです。javadoc は、オプションのCollection および Iterable インターフェースからの実装は、依存するものではありません (つまり、Iterator は順序を保証しない実装を返し、remove()、contains() などの Collection メソッドは線形時間を要します)。

于 2014-12-01T21:52:30.803 に答える