【发布时间】:2014-11-13 10:16:00
【问题描述】:
我需要使用 arraylist 在 java 中实现我自己的通用二进制堆。它需要支持最大堆和最小堆。这应该通过将 Comparator 传递给 BinaryHeap 构造函数来实现。
所以我猜这取决于传递的 Comparator 中的比较方法的作用,它是最小堆还是最大堆。我想我会做一个常规的 PQ(这是默认最小值),然后编写一个扩展 PQ 的 MaxPQ 类并将一个 Comparator 传递给超级构造函数。但是我需要在第一行调用super,所以我不知道在哪里初始化Comparator。有什么想法吗?
这是 MaxHeap 的代码:
import java.util.Comparator;
public class MaxHeap<Bid> extends BinaryHeap<Bid> {
public MaxHeap(){
MaxComp maxComp = new MaxComp();
super(maxComp);
}
}
class MaxComp implements Comparator<Bid>{
public int compare(Bid a, Bid b){
return (a.val - b.val);
}
}
尝试了 Dmitrys 的建议 super(new MaxComp());,它产生了 "BinaryHeap<Bid>(MaxComp) is undefined"。这是带有 Comparator 的超级构造函数:
public class BinaryHeap<E>{
private Comparator<? super E> comp;
private ArrayList<E> array;
private int last; // index of last element
public BinaryHeap(Comparator<? super E> comp){
this.comp = comp;
array = new ArrayList<E>();
}
【问题讨论】:
-
请显示一些代码,以便更清楚您想要做什么,以及您想如何做。
-
你说的PQ是什么意思?
-
PriorityQueue,以为它们基本上是同义词
-
顺便说一句,不要使用
MaxHeap<Bid> extends ...,而是使用MaxHeap extends ...,因为您已经指定了使用extends BinaryHeap<Bid>的类型。我相信那是你的问题。 -
@Dmitry 我知道维基百科通常不是学术来源,但它冒犯地包含共同观点。 states for example:队列是线性数据结构的一个例子,或者更抽象地说是一个顺序集合。当使用像“队列”这样的术语时,你不应该将它与实现细节混在一起来相应地重新定义它。
标签: java comparator