java - PriorityQueue,优先插入

标签 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}

最佳答案

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

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

关于java - PriorityQueue,优先插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29380093/

相关文章:

java - Dijkstra算法-优先级队列问题

我们可以在优先级队列中使用字符值吗?

c++ - 对的优先级队列以相反的顺序

go - 在测距时删除优先级队列中元素的安全方法

c - 如何初始化优先级队列(定制库)

java - spring boot 向环境添加另一个属性文件

java.lang.AssertionError : Content type not set even after setting content type as json/application

java - 静态导入方法重叠

java - 根据用户输入计算运动方程(更短的方法?)

java - 将带有按钮的新行添加到 javafx tableview