itV*_*ico 3 java priority-queue
我想知道如何为具有特定值的PriorityQueue添加值.
我有一个Map<Integer, Integer> // element -> value
,我想elements优先插入PriorityQueue value.
例如:
Map{1=0, 3=5265, 5=22375, 7=4202, 9=233, 11=351, 13=119}
Run Code Online (Sandbox Code Playgroud)
应该在队列中有这个顺序:
{1, 13, 9, 11, 7, 3, 5}
Run Code Online (Sandbox Code Playgroud)
PriorityQueue期望元素彼此相当.它没有明确跟踪每个元素本身的优先级.它只是将它们相互比较.这意味着您需要成对地将元素及其优先级放入队列中.
一种方法是Map.Entry直接添加s并使用自定义比较器创建队列.
PriorityQueue<Map.Entry<Integer, Integer>> queue =
new PriorityQueue<>(Comparator.comparing(entry -> entry.getValue()));
queue.addAll(map.entrySet());
Run Code Online (Sandbox Code Playgroud)
另一种方法是创建一个包含两个实现值的简单类Comparable.就像是:
class ElementPriority implements Comparable<ElementPriority> {
int element;
int priority;
@Override public int compareTo(ElementPriority other) {
return Integer.compare(this.priority, other.priority);
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果你想变得非常hacky,你可以将每对ints组合成long两个值.如果将优先级存储在大端,那么元素应该按优先级自然排序.
PriorityQueue<Long> queue = new PriorityQueue<>();
map.forEach((element, priority) -> {
queue.add((priority & 0xFFFFFFFFL) << 32 | (element & 0xFFFFFFFFL));
});
Run Code Online (Sandbox Code Playgroud)
这是非常可疑的,但嘿,这是什么.
| 归档时间: |
|
| 查看次数: |
4999 次 |
| 最近记录: |