设置队列密钥

时间:2019-02-25 16:12:34

标签: java

我正在尝试创建一个优先级队列,其中的键将为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;       
}

3 个答案:

答案 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();