什么时候优先级队列调用compareTo的元素?

时间:2014-03-26 12:52:35

标签: java multithreading priority-queue

我正在写一个点和盒子的ai。我正在使用优先级队列来包含我的边框。我按照盒子的优先级采取行动。移动后,我必须更新优先级并pool()队列的头部。

以下是一些代码:

   public int compareTo(MyPosition o) {
        if (new Integer(o.getPriority())> new Integer(getPriority())) {
            return 1;
        }else if(new Integer(o.getPriority())== new Integer(getPriority())){
            return 0;
        }else {
            return -1;
        }

    }

但是我的移动顺序与队列的优先级不对应。 这是图片(最后一个数字是边缘的优先级):

enter image description here

所以任何人都可以解释为什么以及如何改进它。 (我猜优先级队列不会在更新后比较优先级。)

非常感谢。

2 个答案:

答案 0 :(得分:2)

在Java中,PriorityQueues实现为堆。因此compareTo()在插入时进行评估。

您可能遇到的一个问题是您可能没有超越正确的方法(正如其他人指出的那样)。将@Override注释添加到compareTo()方法中,编译器会告诉您是否未执行您认为自己正在做的事情(如果您使用的是Java 1.5或更新版本)。

这是代码:

public class MyPosition implements Comparable<MyPosition>{
    private Integer priority;

    @Override
    public int compareTo(MyPosition that) {
        return this.priority.compareTo(that.priority);
    }
}

答案 1 :(得分:0)

尝试使用compareTo类的compareTo方法实施Integer

public int compareTo(MyPosition o) {
    return Integer.valueOf(getPriority()).compareTo(Integer.valueOf(o.getPriority()));
}

我在此处看到的一个错误是您将对象与==符号进行比较。虽然它适用于原始类型(例如int),但在某些情况下适用于Integer,但它会为较大的数字提供错误的结果。在你的例子中,这似乎不是一个问题,但我只想指出这一点。应使用equals()方法比较对象的相等性。

另一个问题可能是您未在Comparable课程中实施MyPosition界面。