7

私がやっているのは、3 つの文字列を Java PriorityQueue に追加してから出力することだけです。これが私のコードです。

import java.util.*;
import java.lang.*;

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        PriorityQueue<String> pq=new PriorityQueue<String>();
        pq.add("abc");
        pq.add("ability");
        pq.add("aberdeen");

        String s="ability";
        System.out.println(s.compareTo("aberdeen"));

        System.out.println(pq);
    }
}

そして、これは出力です:

4
[abc, ability, aberdeen]

これは代わりにすべきではありませんabc, aberdeen, ability。それが正しいアルファベット順だから?

4

2 に答える 2

12

のドキュメントからPriorityQueue.iterator():

このキュー内の要素の反復子を返します。イテレータは特定の順序で要素を返すわけではありません。

実装はから継承toString()されているため、文字列表現を構築するために使用しているものは次のとおりです。AbstractCollection

このコレクションの文字列表現を返します。文字列表現は、イテレータによって返される順序でコレクションの要素を角括弧 ("[]") で囲んだリストで構成されます。[...]

代わりに結果をデキューしてみると、期待どおりの順序が得られます。

while (pq.size() > 0) {
    System.out.println(pq.poll());
}

出力:

abc
aberdeen
ability
于 2013-01-27T21:37:00.343 に答える
5

キューは正常に機能します。次のコードを実行します。

PriorityQueue<String> pq=new PriorityQueue<String>();
pq.add("abc");
pq.add("ability");
pq.add("aberdeen");
System.out.println(pq);
for (String s; (s = pq.poll()) != null;) System.out.println(s);

印刷します

[abc, ability, aberdeen]
abc
aberdeen
ability

その理由は、優先度セマンティクスがデキュー操作にのみ適用されるのに対し、他の点では、キューはプレーンの契約によってのみバインドされるという事実にありますjava.util.Collection。そのイテレータは特定の順序を遵守する必要はなく、具体的にはPriorityQueueのイテレータたまたま挿入順序を守っています。

于 2013-01-27T21:39:43.230 に答える