PriorityQueue,优先插入

时间:2015-03-31 23:07:17

标签: java priority-queue

我想知道如何为具有特定值的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}

1 个答案:

答案 0 :(得分:5)

PriorityQueue期望元素彼此相当。它没有明确跟踪每个元素本身的优先级。它只是将它们相互比较。这意味着您需要成对地将元素及其优先级放入队列中。

一种方法是直接添加Map.Entry并使用自定义比较器创建队列。

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);
    }
}

或者如果你想变得非常hacky,你可以将每对int组合成一个long来保存这两个值。如果将优先级存储在大端,那么元素应该按优先级排序。

PriorityQueue<Long> queue = new PriorityQueue<>();

map.forEach((element, priority) -> {
    queue.add((priority & 0xFFFFFFFFL) << 32 | (element & 0xFFFFFFFFL));
});

这是非常可疑的,但是嘿,这到底是什么。