我想知道如何將值添加到具有特定值的PriorityQueue。PriorityQueue,優先插入
我有一個Map<Integer, Integer> // element -> value
,我想插入elements
到時Queue與value
優先。
例如:
Map{1=0, 3=5265, 5=22375, 7=4202, 9=233, 11=351, 13=119}
應該在隊列順序如下:
{1, 13, 9, 11, 7, 3, 5}
我想知道如何將值添加到具有特定值的PriorityQueue。PriorityQueue,優先插入
我有一個Map<Integer, Integer> // element -> value
,我想插入elements
到時Queue與value
優先。
例如:
Map{1=0, 3=5265, 5=22375, 7=4202, 9=233, 11=351, 13=119}
應該在隊列順序如下:
{1, 13, 9, 11, 7, 3, 5}
PriorityQueue
預計元件是相互媲美。它沒有明確跟蹤每個元素本身的優先級。它只是將它們相互比較。這意味着您需要將這些元素及其優先級成對排隊。
一種方法是直接添加Map.Entry
s並使用自定義比較器創建隊列。
PriorityQueue<Map.Entry<Integer, Integer>> queue =
new PriorityQueue<>(Comparator.comparing(entry -> entry.getValue()));
queue.addAll(map.entrySet());
另一種方法是創建一個簡單的類控股實現Comparable
兩個值。喜歡的東西:
class ElementPriority implements Comparable<ElementPriority> {
int element;
int priority;
@Override public int compareTo(ElementPriority other) {
return Integer.compare(this.priority, other.priority);
}
}
或者,如果你想獲得真正哈克可以在每次對int
小號組合成一個long
拿着兩個值。如果您將優先級存儲在大端,那麼這些元素應自然按優先級排序。
PriorityQueue<Long> queue = new PriorityQueue<>();
map.forEach((element, priority) -> {
queue.add((priority & 0xFFFFFFFFL) << 32 | (element & 0xFFFFFFFFL));
});
這是非常可疑的,但嘿,到底是什麼。
我還是有點困惑。第一種方法給我一個鑄造錯誤。我想我會嘗試第二個。 – Sensei 2015-03-31 23:24:56
您可以在'PriorityQueue'中插入'Map.Entry'並提供這些'比較器'。或者使用關聯的「比較器」創建自己的具有優先級和值的「Pair」類型。 – 2015-03-31 23:11:33
可能重複[Java:我如何使用PriorityQueue?](http://stackoverflow.com/questions/683041/java-how-do-i-use-a-priorityqueue) – displayname 2015-03-31 23:11:40
@SotiriosDelimanolis我不知道如何應該這樣做。 – Sensei 2015-03-31 23:14:53