我正在尝试创建一个优先级队列,其中的键将为Total()= getCost()+ getTax()。我正在像这样设置优先级队列:
PriorityQueue<Node> pq = new PriorityQueue<Node>(50);
我一直在寻找有关优先级队列的内容,并且阅读了有关比较器的内容,但我仍然一无所获。如何使用以下方法为优先级队列设置密钥?
获取总计的方法:
public int compareTo(Node y){
if (getCost() + getTax() > y.getCost() + y.getTax())
return 1;
else if (getCost() + getTax() < y.getCost() + y.getTax())
return -1;
return 0;
}
答案 0 :(得分:1)
初始化PriorityQueue
时,您可以直接通过Comparator:
PriorityQueue<Node> pq = new PriorityQueue<Node>(50, (x, y) -> {
if (x.getCost() + x.getTax() > y.getCost() + y.getTax())
return 1;
else if (x.getCost() + x.getTax() < y.getCost() + y.getTax())
return -1;
return 0;
});
答案 1 :(得分:0)
我将采用以下解决方案:
PriorityQueue<Node> pq = new PriorityQueue<>(50, Node::compareTo);
PriorityQueue构造函数可以具有初始容量和Comparator对象。从Java 8开始,可以用lambda或方法引用替换此对象(如我的示例)。
答案 2 :(得分:0)
PriorityQueue
在实现Comparable
接口时将自动使用对象的“自然顺序”。它将使用compareTo()
类的Node
方法来选择下一个Node
对象。您无需提供其他Comparator
类来为您比较Node
对象。
public Node implements Comparable<Node>
{
// [...]
@Override
public int compareTo(Node y){
if (getCost() + getTax() > y.getCost() + y.getTax())
return 1;
else if (getCost() + getTax() < y.getCost() + y.getTax())
return -1;
return 0;
}
}
然后只需创建一个使用PriorityQueue
对象。
PriorityQueue<Node> queue = new PriorityQueue<Node>();
queue.add(node1);
queue.add(node2);
queue.add(node3);
Node next = queue.poll();