实现Java Comparator

时间:2013-04-05 17:33:55

标签: java implementation priority-queue comparator

我正在尝试编写一个利用最小优先级队列的算法,因此我在google上查看并找到了PriorityQueue。看来,为了使用它,我需要告诉它我希望它如何优先排序,并且这样做的方法是使用比较器(我想比较我的“Node1”的特定数据字段)对象)。更多的谷歌搜索提出了创建一个新比较器的想法,该比较器实现了比较器,但覆盖了比较方法。我正在尝试的是这个(以及它的其他变体):

import java.util.Comparator;

public class distComparator implements Comparator {

    @Override
    public int compare(Node1 x, Node1 y){
        if(x.dist<y.dist){
            return -1;
        }
        if(x.dist>y.dist){
            return 1;
        }
        return 0;
    }
}

编译器在几个方面提出抗议,其中一个原因是我没有超越比较器类(它说它是抽象的)

  

错误:distComparator不是抽象的,并且不会覆盖比较器中的抽象方法compare(Object,Object)

我已将其切换为“比较(对象x,对象y)”,它负责处理该问题。此时虽然编译器抱怨它无法在x或y中找到“dist”变量 - 这是有道理的,因为它们是我的Node1类的一部分,而不是Object类。

那么这应该是怎么回事?它显然应该有Object类型,但是如何将它引导到正确的变量?

2 个答案:

答案 0 :(得分:17)

您需要实施Comparator<Node1>

public class distComparator implements Comparator<Node1> {
                                                 ^^^^^^^

如果没有这个,你正在实施Comparator<Object>,这不是你想要的(它可以起作用,但不值得麻烦)。

如果Node1有一个名为dist的可访问成员,则问题中的其他代码就可以了。

请注意,如果您使用的是Java 7,则可以使用

替换该方法的整个主体
return Integer.compare(x.dist, y.dist);

(将Integer替换为Double等,具体取决于Node1.dist的类型。)

答案 1 :(得分:3)

正如您所见here (the JSE Comparator JavaDoc page)Comparator接口有一个通用的“参数” 描述类型 这个比较器的设计。 PriorityQueue类似。

所以, 如果您创建PriorityQueue<Node1>, 您可以按如下方式创建Comparator<Node1>

public class distComparator implements Comparator<Node1> {    
    @Override
    public int compare(Node1 x, Node1 y){
        return x.dist - y.dist;
    }
}