简单的Java PriorityQueue <String>错误

Pro*_*oob 6 java priority-queue

我所做的只是将三个字符串添加到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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

4
[abc, ability, aberdeen]
Run Code Online (Sandbox Code Playgroud)

不应该这样做abc, aberdeen, ability.既然这是正确的字母顺序?

Jon*_*eet 11

来自以下文件PriorityQueue.iterator():

返回此队列中元素的迭代器.迭代器不会以任何特定顺序返回元素.

toString()是用于构造字符串表示的内容,因为实现继承自AbstractCollection:

返回此集合的字符串表示形式.字符串表示由一个集合元素的列表组成,它们的迭代器返回它们的顺序,用方括号("[]")括起来.[...]

尝试将结果出列,然后您将获得预期的顺序:

while (pq.size() > 0) {
    System.out.println(pq.poll());
}
Run Code Online (Sandbox Code Playgroud)

输出:

abc
aberdeen
ability
Run Code Online (Sandbox Code Playgroud)


Mar*_*nik 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);
Run Code Online (Sandbox Code Playgroud)

它将打印

[abc, ability, aberdeen]
abc
aberdeen
ability
Run Code Online (Sandbox Code Playgroud)

原因在于,优先级语义仅适用于出队操作,而在其他方面,队列仅受 plain 的契约约束java.util.Collection:其迭代器不需要遵守任何特定顺序,特别是PriorityQueue的迭代器碰巧观察了插入顺序。