简单的Java PriorityQueue 错误
我正在做的是将三个字符串添加到Java PriorityQueue然后将它们打印出来这是我的代码:
import java.util.*; import java.lang.*; class Main { public static void main (String[] args) throws java.lang.Exception { PriorityQueue pq=new PriorityQueue(); 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
而是abc, aberdeen, ability
。 既然这是正确的字母顺序?
从PriorityQueue.iterator()
的文档:
返回此队列中元素的迭代器。 迭代器不会以任何特定顺序返回元素。
这就是toString()
用来构造字符串表示的原因,因为实现是从AbstractCollection
inheritance的 :
返回此集合的字符串表示forms。 字符串表示由一个集合元素的列表组成,它们按迭代器返回的顺序排列,用方括号(“[]”)括起来。 […]
尝试将结果出列,然后您将获得预期的顺序:
while (pq.size() > 0) { System.out.println(pq.poll()); }
输出:
abc aberdeen ability
队列正常工作。 运行此代码:
PriorityQueue pq=new PriorityQueue (); 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
的迭代器恰好遵守插入顺序。