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

时间:2014-07-11 20:46:39

标签: 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,因为你只能比较这个和另一个变量,并且不能将两个单独的变量传递给类。实现Comparator解决了这个问题。

import java.util。*;

public class Hello implements Comparator<Adjacency>{

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

      }

}

3 个答案:

答案 0 :(得分:3)

这不是你应该怎么做的。不要将PriorityQueue作为子类。 最简单的方法是在Comparable<Adjacency>课程中实施Ajacency

在你的情况下,这可能是这样的:

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);
    }
}

答案 1 :(得分:2)

PriorityQueue有一个构造函数that supports overriding its default Comparator

这意味着您必须为队列提供初始容量,但您也可以制作自己的自定义比较器,这是您想要的,而无需修改或触及{{1 }}

除非您授权PriorityQueue课程为Adjacency,否则您无需在Comparable上实施Comparable

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

这是一个例子。您检查Comparator;下面的代码段仅用于说明目的。

null

答案 2 :(得分:1)

您可以使用以下方法覆盖Priority Queue Comparator:

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

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