PriorityQueue,优先插入
PriorityQueue, insert with priority
我想知道如何将一个值添加到具有特定值的 PriorityQueue。
我有一个Map<Integer, Integer> // element -> value
我想将 elements
插入优先级为 value
的 PriorityQueue。
例如:
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());
另一种方法是创建一个简单的 class 来保存实现 Comparable
的两个值。类似于:
class ElementPriority implements Comparable<ElementPriority> {
int element;
int priority;
@Override public int compareTo(ElementPriority other) {
return Integer.compare(this.priority, other.priority);
}
}
或者,如果你想变得非常 hacky,你可以将每对 int
组合成一个包含两个值的 long
。如果您将优先级存储在大端,那么元素自然应该按优先级排序。
PriorityQueue<Long> queue = new PriorityQueue<>();
map.forEach((element, priority) -> {
queue.add((priority & 0xFFFFFFFFL) << 32 | (element & 0xFFFFFFFFL));
});
这非常可疑,但是,嘿,到底是什么。
我想知道如何将一个值添加到具有特定值的 PriorityQueue。
我有一个Map<Integer, Integer> // element -> value
我想将 elements
插入优先级为 value
的 PriorityQueue。
例如:
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());
另一种方法是创建一个简单的 class 来保存实现 Comparable
的两个值。类似于:
class ElementPriority implements Comparable<ElementPriority> {
int element;
int priority;
@Override public int compareTo(ElementPriority other) {
return Integer.compare(this.priority, other.priority);
}
}
或者,如果你想变得非常 hacky,你可以将每对 int
组合成一个包含两个值的 long
。如果您将优先级存储在大端,那么元素自然应该按优先级排序。
PriorityQueue<Long> queue = new PriorityQueue<>();
map.forEach((element, priority) -> {
queue.add((priority & 0xFFFFFFFFL) << 32 | (element & 0xFFFFFFFFL));
});
这非常可疑,但是,嘿,到底是什么。