我的程序工作正常,直到我查出几个项目然后加入,有时我的商品方法将一个项目放在队列的前面而不是后面。我已经添加了一些打印语句,因此可以看到队列中发生了什么。
import java.util.*;
public class PriorityQ {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
PriorityQueue<String> q = new PriorityQueue<String>();
String input = "";
while (!input.equals("X")) {
input = s.nextLine();
if (input.equals("O") && q.peek() == null) {
System.out.println("Buffer empty");
}
else if (!input.equals("O")) {
q.offer(input);
System.out.println(q);
}
else if (q.peek() != null && input.equals("O")) {
System.out.print("Data: ");
System.out.printf("%s ", q.peek());
q.poll();
System.out.println();
System.out.println(q);
}
}
}
}
I / O如下:
line1
[line1]
line2
[line1, line2]
line3
[line1, line2, line3]
O
Data: line1
[line2, line3]
O
Data: line2
[line3]
line1
[line1, line3]
最后一行是我的问题,它将line1放在第3行的前面。 感谢您的帮助:)
答案 0 :(得分:2)
阅读PriorityQueue
的javadoc:
方法
iterator()
中提供的迭代器 not 保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用Arrays.sort(pq.toArray())
。
println(q)
调用toString()
继承自使用AbstractCollection
的{{1}},因此打印队列将按任意顺序列出元素。
轮询已订购。迭代不是。
答案 1 :(得分:1)
所以我应该在偷看和投票之前对其进行排序?
在偷看/民意调查之前,没有必要或者不需要排序。它将始终从PriorityQueue返回正确的项目。
参考Oracle jdk源代码,toString()
的{{1}}方法在内部使用PriorityQueue
方法打印iterator()
的内容。正如@Andreas指出的那样,
因为不保证iterator()不会以任何特定顺序遍历优先级队列的元素,所以您看到的顺序与调用peek / poll方法时所看到的顺序不同。