16

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

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 不是抽象的,并且不会覆盖 Comparator 中的抽象方法 compare(Object,Object)

我已将其切换为“比较(对象 x,对象 y)”,它可以解决该问题。在这一点上,尽管编译器抱怨它在 x 或 y 中找不到“dist”变量——这是有道理的,因为它们是我的 Node1 类的一部分,而不是 Object 类。

那么这应该如何工作呢?显然,它应该有 type Object,但是我如何将它定向到正确的变量?

4

2 回答 2

20

您需要实施Comparator<Node1>

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

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

您问题中的其余代码都很好,只要Node1有一个名为dist.

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

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

(替换IntegerDoubleetc,取决于 的类型Node1.dist。)

于 2013-04-05T17:42:33.163 回答
4

正如您在此处(JSE Comparator JavaDoc 页面)所看到的,该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;
    }
}
于 2013-04-05T18:01:30.170 回答