7

我所做的只是将三个字符串添加到 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 回答