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)
队列工作正常。运行这段代码:
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的迭代器碰巧观察了插入顺序。