实现 Java 比较器

我正在尝试编写一种利用最小优先级队列的算法,所以我在谷歌上环顾四周,找到了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


答案 1

您需要实现:Comparator<Node1>

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

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

您的问题中的其余代码没有问题,前提是具有名为 的可访问成员。Node1dist

请注意,如果您使用的是 Java 7,则该方法的整个主体可以替换为

return Integer.compare(x.dist, y.dist);

(替换为 etc,具体取决于 的类型。IntegerDoubleNode1.dist


答案 2

正如您在这里看到的(JSE Comparator JavaDoc页面),该接口有一个通用的“参数”,用于描述此比较器的设计类型。优先级队列与此类似。Comparator

因此,如果创建 一个 ,则可以按如下方式创建:PriorityQueue<Node1>Comparator<Node1>

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

推荐