在Java中实现Comparator类

时间:2016-04-05 18:09:36

标签: java

我是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(); 将被调用?

2 个答案:

答案 0 :(得分:4)

是的,比较器会命令您传递构造函数。来自文档:

https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html

队列的头部是具有最低值的项目。比较器将在构造函数上调用,或者从集合接口调用add()或从队列接口调用offer()方法。只需查看源代码:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/PriorityQueue.java#267

或者写一些证明它正在发生的测试。

答案 1 :(得分:1)

如果f值本身为Comparable,您可能需要使用

return A.f().compareTo(B.f());

这将确保您的数据按f的自然顺序排序,否则您可以像在提供的示例中一样自己定义比较器功能。