当前位置: 首页 > 知识库问答 >
问题:

实现Java比较器

戚正业
2023-03-14

我正在尝试编写一个使用最小优先级队列的算法,所以我在谷歌上四处查看并找到了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;
    }
}

编译器有几个理由提出抗议,其中之一是我没有过度使用comparator类(它说它是抽象的)

错误:distComparator不是抽象的,并且不重写Comparator中的抽象方法比较(Object,Object)

我把它改为“比较(对象x,对象y)”,它解决了这个问题。此时,编译器抱怨在x或y中找不到“dist”变量,这很有意义,因为它们是Node1类的一部分,而不是Object类。

那么这是怎么回事?显然,它应该具有typeObject,但我如何将其定向到正确的变量?

共有2个答案

魏硕
2023-03-14

正如您在这里看到的(JSE比较器JavaDoc页面),比较器接口有一个通用的“参数”,描述了设计此比较器的类型。PriorityQueue类似。

因此,如果您创建一个优先级队列

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

您需要实现比较器

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

如果没有这个,您将实现比较器

您问题中的其余代码很好,前提是Node1有一个名为dist的可访问成员。

注意,如果您使用的是Java 7,那么整个方法体可以替换为

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

(根据节点1.dist的类型,将整数替换为双精度等)

 类似资料:
  • 我在理解和使用比较器方面有一个问题,有人问我以下问题: 我在一个单独的Employee类中使用compareTo比较器接口来调用比较器对象的重载使用。 任何帮助,建议,代码行将非常感谢!!

  • 我知道这些接口用于对集合中的对象进行排序。但我怀疑这两者的真正区别。我读到的一个事实是,如果要比较两个对象而不使用当前对象,请使用Compariable(此)。 但我的问题是即使使用比较器,我们也会比较相同的对象类型。 这里真正的区别是什么。我很困惑。假设下面的例子, 如果我使用比较器,我会让一个类实现比较器,而不是这个。年龄,它有人。年龄那么这里有什么不同呢? 我不知道Collections.s

  • 问题内容: 我正在尝试编写一种利用最小优先级队列的算法,因此我在Google上四处查看,发现了PriorityQueue。不过,似乎要使用它,我将需要告诉它我如何确定优先级,并且这样做的方法是使用比较器(我想比较“ Node1”的特定数据字段)对象)。更多的谷歌搜索提出了创建一个新的比较器的想法,该比较器实现了Comparator但覆盖了compare方法。我正在尝试的是这个(以及它的其他变体):

  • 我被给了下面的代码作为家庭作业。我被要求为雇员对象实现比较器。compare方法返回一个int。但是,如果对employee类中的方法进行比较,则没有一个方法返回int。谁能给我一些关于比较方法应该如何工作的指导?谢谢。

  • 嗨,我是贾维斯的新手。 我有一个实体,我正在为它实现一个自定义比较器,以便使用Javers进行比较。 我的实体:- 包装com.devyansh.entity; 进口java.util.清单; 导入组织。贾维斯。果心元模型。注释。实体 下面我注册了新的比较器:- 我的比较器实现:- 问题领域:- 每当我尝试使用以下行进行比较时:- Diff Diff=标枪。比较(new Ent(“aaa”,new

  • 我有一个使用对象标识的令牌类(如只返回)。我想在中使用它。这意味着我需要实现与引用相等兼容的两个令牌之间的比较。我不关心具体的实现,只要它与一致并履行契约(根据:"注意,如果要正确实现Set接口,由set维护的顺序(无论是否提供显式比较器)必须与equals一致。") 注意:这些令牌是在多个线程上创建的,可以在不同的线程上进行比较。 这样做的最佳方法是什么? 我尝试过的想法: 使用——问题在于,不