本文介紹了Java中的PriorityQueue不是確定性的嗎?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
當我運行以下優先級隊列測試時:
class Run {
public static void main(String[] args) {
PriorityQueue<Entry> q = new PriorityQueue<>(8, Collections.reverseOrder(new Comparator<Entry>() {
@Override
public int compare(Entry o1, Entry o2) {
return Integer.compare(o1.getValue(), o2.getValue());
}
}));
q.offer(new Entry(100));
q.offer(new Entry(0));
q.offer(new Entry(1));
q.offer(new Entry(-1));
q.offer(new Entry(0));
q.offer(new Entry(1));
q.offer(new Entry(-100));
q.offer(new Entry(100));
while (q.peek() != null) {
System.out.println(q.poll());
}
}
private static class Entry {
private static int GLOBAL_ID = 0;
private final int value, id;
public Entry(int value) {
this.value = value;
id = GLOBAL_ID++;
}
public int getValue() {
return value;
}
@Override
public String toString() {
return "Entry[" + id + ", value = " + value + ']';
}
}
}
我得到以下結果:
Entry[0, value = 100]
Entry[7, value = 100]
Entry[2, value = 1]
Entry[5, value = 1]
Entry[4, value = 0]
Entry[1, value = 0]
Entry[3, value = -1]
Entry[6, value = -100]
我希望以與輸入相同的順序輸出相等的元素,因此當條目0在條目7之前提供時,它也會在輪詢7之前被輪詢。但是為什么條目4突然在1之前被輪詢?是錯誤的Comparator
還是PriorityQueue
不能保證確定性行為?
推薦答案
它是非確定性的。
來自documentation for PriorityQueue
如果多個元素的值最小,則頭元素是
那些元素–紐帶被任意打破。
這篇關于Java中的PriorityQueue不是確定性的嗎?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,