我正在写一个点和盒子的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;
}
}
但是我的移动顺序与队列的优先级不对应。 这是图片(最后一个数字是边缘的优先级):
所以任何人都可以解释为什么以及如何改进它。 (我猜优先级队列不会在更新后比较优先级。)
非常感谢。
答案 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
界面。