【问题标题】:Priority Queue <Double> vs Priority Queue <Node>优先队列 <Double> 与优先队列 <Node>
【发布时间】:2017-04-26 00:32:52
【问题描述】:
好的,所以我正在尝试使用 java 优先级队列按节点包含的双倍值对节点进行排序。我知道如何通过双倍执行优先级队列,但我需要其余的节点值来构建霍夫曼编码树。有没有办法按节点的 val 对节点的优先级队列进行排序,或者我最好让队列对双 val 进行排序,然后尝试将它们与节点匹配?
【问题讨论】:
-
假设您在 Node 类中实现 Comparator<Node> 并进行排序。这个post 可能对你得到解决方案有帮助。
标签:
java
node.js
double
priority-queue
comparator
【解决方案1】:
您有两个选择,选择取决于Double 在Node 中的含义:
- 让
Node 实现Comparable<Node>,并使用PriorityQueue<Node>。 compareTo 方法将按Double 排序。您想要的队列顺序是元素的自然顺序。
- 使用带有
Comparator 参数的PriorityQueue 构造函数。您用于队列的Comparator 应根据Double 值排序。
如果Double 确实是节点的自然顺序,则第一个更好。第二个更好,如果它只对这个队列很重要,而其他字段对其他用途同样重要。
【解决方案2】:
您可以使用 PriorityQueue 实现并通过在队列构建期间重写 Comparator 接口的 compare 方法来管理元素的顺序。
例如:
要按节点值的升序对元素进行排序,请使用下面提到的优先级队列声明,然后简单地将节点添加到优先级队列中。
PriorityQueue<Node> pq = new PriorityQueue<Node>(new Comparator<Node>(){
public int compare(Node node1, Node node2){
if(node2.val>node1.val){
return -1;
}
else{
return 1;
}
}
});