gpt4 book ai didi

java - 优先级队列中无法识别覆盖的compareTo()

转载 作者:行者123 更新时间:2023-12-01 20:07:42 25 4
gpt4 key购买 nike

我在 Disk 类中实现了compareTo(),尽管当我在 main 中使用它时它工作正常,但当我尝试编译使用相同方法的优先级队列时,它给了我以下错误:

MaxPQ.java:113: 错误:二元运算符“>=”的操作数类型错误 if ((Disk)heap[i].compareTo((Disk)heap[max]) >= 0)

知道为什么吗?

代码如下:


public class Disk implements Comparable <Disk>{

public static int count = 0;
public int id;
//public Node folders;
public int freeSpace;

public Disk(){
count++;
id = count;
}

public int getFreeSpace(){
return freeSpace;
}

@Override
public int compareTo(Disk d){
return Integer.compare(this.getFreeSpace(), d.getFreeSpace());
}


}

还有:

public class MaxPQ<Disk> {


private Disk[] heap; // the heap to store data in
private int size; // current size of the queue
//private Comparator comparator; // the comparator to use between the objects

private static final int DEFAULT_CAPACITY = 4; // default capacity
private static final int AUTOGROW_SIZE = 4; // default auto grow


//public MaxPQ(Comparator comparator) {
public MaxPQ() {
this.heap = (Disk[])new Object[DEFAULT_CAPACITY + 1];
this.size = 0;
//this.comparator = comparator;
}

private void sink(int i) {
// determine left, right child
int left = 2 * i;
int right = left + 1;

// if 2*i > size, node i is a leaf return
if (left > size)
return;

// while haven't reached the leafs
while (left <= size) {
// Determine the largest child of node i
int max = left;
if (right <= size) {
if (heap[left].compareTo(heap[right]) < 0)
max = right;
}

// If the heap condition holds, stop. Else swap and go on.
// child smaller than parent
if ((Disk)heap[i].compareTo((Disk)heap[max]) >= 0)
return;
else {
swap(i, max);
i = max;
left = i * 2;
right = left + 1;
}
}
}

最佳答案

问题是您使用 Disk 作为泛型类型参数,然后尝试像类一样使用它。

看起来MapPQ不应该是一个泛型类。它专门使用Disk。所以我会:

  1. 更改声明,使其不再通用;
  2. 使用new Disk[DEFAULT_CAPACITY + 1]创建
  3. 并删除所有这些强制转换

如果您确实希望Disk是通用的(惯例是使用单个字母,而不是单词;我将使用T,它绝大多数是用于第一个泛型类型参数),实例化 MapPQ 时,您必须让调用者传入它应用于数组的 Class 实例。请参阅this question's answers了解如何做到这一点,但大致是:

public MapPQ(Class<T> cls) {
ths.heap = (T[])Array.newInstance(cls, DEFAULT_CAPACITY + 1);
}

(或者将 heap 声明为 Object[] 并保留所有转换,但这很容易出错。)

关于java - 优先级队列中无法识别覆盖的compareTo(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59438058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com