我是java的新手。在实现以下代码时我没有理解一件事:
public class Demo
{
class DemoComparator implements Comparator<Board>
{
@Override
public int compare(Board A, Board B) {
return A.f()-B.f();
}
PriorityQueue<Board>Q = new PriorityQueue<>(10, new DemoComparator());
}
这里,Board是一个我无法显示的类,f()是一个返回整数值的函数。我的问题是如果我写:
Q.add(element1);
Q.add(element2);
Q.add(element3);
其中,element1,element2和element3属于Board类型,并且从各自的f()函数返回自己的f值。
考虑到任何增加或减少的顺序,element1,element2和element3是否会根据它们的f值存储在优先级队列中?当行:返回A.f() - B.f(); 将被调用?
答案 0 :(得分:4)
是的,比较器会命令您传递构造函数。来自文档:
https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html
队列的头部是具有最低值的项目。比较器将在构造函数上调用,或者从集合接口调用add()或从队列接口调用offer()方法。只需查看源代码:
或者写一些证明它正在发生的测试。
答案 1 :(得分:1)
如果f
值本身为Comparable
,您可能需要使用
return A.f().compareTo(B.f());
这将确保您的数据按f
的自然顺序排序,否则您可以像在提供的示例中一样自己定义比较器功能。