繁体   English   中英

尝试覆盖Java中PriorityQueue的现有比较器

[英]Attempting to override existing comparator for PriorityQueue in Java

因此,我尝试使用Java中的优先级队列数据结构来实现Dijkstra的算法。 我唯一需要修改的是可比运算符,因为java不能比较两个Adjacency类型的变量(用户定义)。 我想使用PriorityQueue数据结构,我要做的就是修改compareTo运算符,以便它可以比较两个Adjacency类型的变量。 到目前为止,我得到的错误是“类型PriorityQueue必须实现继承的抽象方法Comparable.compareTo(Adjacency)”。 当我尝试在compareTo运算符上方添加“ @override”标签时,出现错误“无法将覆盖解析为类型”。

public class Adjacency {
  public int vertex;
  public double weight;
  public Adjacency(int v, double w) {
    vertex = v;
    weight = w;
  }
}

public class PriorityQueue<T extends PriorityQueue<T>> implements Comparable<Adjacency> {


    public int compareTo(Adjacency o1, Adjacency o2) {
        return Double.compare(o1.weight, o2.weight);


    }

}

编辑:这是实现Comparator的Hello类。 我犯的错误是使用Comparable,因为您只能比较此变量和另一个变量,并且不能将两个单独的变量传递给类。 实施比较器可以解决该问题。

导入java.util。*;

public class Hello implements Comparator<Adjacency>{

    @Override
    public int compare(Adjacency o1, Adjacency o2) {
       return Double.compare(o1.weight, o2.weight);

      }

}

那不是您应该怎么做。 不要将PriorityQueue子类化。 最简单的方法是在Ajacency类中实现Comparable<Adjacency>

在您的情况下,可能如下所示:

public class Adjacency implements Comparable<Adjacency> {
    public int vertex;
    public double weight;
    public Adjacency(int v, double w) {
        vertex = v;
        weight = w;
    }

    @Override
    public int compareTo(Adjacency other) {
        return Double.compare(this.weight, other.weight);
    }
}

PriorityQueue具有一个支持重写其默认Comparator的构造函数。

这意味着您必须为队列提供初始容量,而且还可以制作自己想要的自定义比较器,而无需修改或触摸PriorityQueue的实现。

除非您具有将Adjacency类设为Comparable ,否则根本不需要在Adjacency上实现Comparable

编辑:由于您已经引起我们注意,您无法真正修改Adjacency类,因此使用自定义Comparator可能是正确的选择。

这是一个例子。 应该检查null 下面的代码段仅用于说明目的。

Comparator<Adjacency> adjacencyComparator = new Comparator<Adjacency>() {

    @Override
    public int compare(Adjacency left, Adjacency right) {
        return left.weight.compareTo(right.weight);
    } 
};

您可以使用以下方法覆盖优先级队列比较器:

    PriorityQueue<Adjacency>priorityQueue=new PriorityQueue<>(new Comparator<Adjacency>() {
        @Override
        public int compare(Adjacency adjacency, Adjacency t1) {
            return 0;
        }
    });

只需根据需要更改比较样式...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM