使用priorityQueue实现特定的java MaxHeap

使用priorityQueue实现特定的java MaxHeap,java,heap,heapsort,Java,Heap,Heapsort,我将使用priorityQueue实现特定的java maxHeap,如下所示: 假设我有一个“Customer”类,它有一个双变量名“marginalGain” PriorityQueue marginalGainHeap=new PriorityQueue(); 如何使用“marginalGain”变量的自然顺序来处理“marginalGainHeap”?是否可以使用PriorityQueue,或者我需要自己重新实现MaxHeap 问候。您可以使用PriorityQueue,但是值得记住的

我将使用priorityQueue实现特定的java maxHeap,如下所示: 假设我有一个“Customer”类,它有一个双变量名“marginalGain”

PriorityQueue marginalGainHeap=new PriorityQueue();
如何使用“marginalGain”变量的自然顺序来处理“marginalGainHeap”?是否可以使用PriorityQueue,或者我需要自己重新实现MaxHeap


问候。

您可以使用PriorityQueue,但是值得记住的是,只有第一个条目会被排序。很可能您希望TreeSet作为SortedSet

在任何情况下,您都需要使客户具有可比性,或者更可能是一个更好的解决方案。最好创建一个
比较器
,因为您可能希望按多个顺序对客户进行排序。注意:您需要订购所有客户,即即使他们的保证金相同,您也需要向他们下订单

您可以使用具有优先级队列的比较器,如下所示

PriorityQueue<Customer> pq = new PriorityQueue<Customer>(new Comparator<Customer>() {
    public int compare(Customer c1, Customer c2) {
       return Double.compare(c1.getMarginGain(), c2.getMarginGain());
    }
});
PriorityQueue pq=新的PriorityQueue(新的比较器(){
公共整数比较(客户c1、客户c2){
返回Double.compare(c1.getMarginGain(),c2.getMarginGain());
}
});

PriorityQueue的一个优点是,您不必确保comparator不会为不同的客户返回0(在树集中,它会将这些客户视为重复客户并丢弃它们)

我尝试使用PriroityQueue编写一个实现最大堆的类,如下所示,这可能对您的问题有所帮助:

class MaxHeapUsingPriorityQueue<T>{
int capacity;
Comparator<T> pqc;
Queue<T> q;
public MaxHeapUsingPriorityQueue(int capacity, Comparator<T> comparator){
    this.capacity = capacity;
    this.pqc = comparator;
    q = new PriorityQueue<T>(comparator);
}

void add(T t){
    if(q.size() < capacity) q.offer(t);
    else{
        if(pqc.compare(t, q.peek()) > 0){
            q.poll();
            q.offer(t);
        }
    }
}

void displayMaxHeapContent(){
    // in ascending order
    while(!q.isEmpty()) System.out.println(q.poll().toString());
}
class MaxHeapUsingPriorityQueue{
国际能力;
比较器pqc;
队列q;
公共MaxHeapUsingPriorityQueue(int容量、比较器比较器){
这个。容量=容量;
this.pqc=比较器;
q=新的优先级队列(比较器);
}
无效添加(T){
if(q.size()<容量)q.报价(t);
否则{
如果(pqc.compare(t,q.peek())>0){
q、 poll();
q、 报价(t);
}
}
}
void displayMaxHeapContent(){
//按升序
而(!q.isEmpty())System.out.println(q.poll().toString());
}

}

您的
客户
是否实现了
可比
?那么您仍然可以编写一个自定义的
比较器
,并在构建队列时将其作为参数传递;但这需要您设置初始容量。初始容量未知,所以我可能会更改客户类别。(更改该类别很昂贵,但如果这是我唯一的选择,我会这样做)我应该向客户添加什么方法?您能解释一下吗?“但是值得记住的是,只有第一个条目会被排序”@fge PriorityQueue保证第一个条目是最低的,但是如果您迭代它,后面的条目可以是任何顺序。对我来说,最大的一个就足够了。您能告诉我如何添加比较器吗?@Alin添加了一个比较器示例。
class MaxHeapUsingPriorityQueue<T>{
int capacity;
Comparator<T> pqc;
Queue<T> q;
public MaxHeapUsingPriorityQueue(int capacity, Comparator<T> comparator){
    this.capacity = capacity;
    this.pqc = comparator;
    q = new PriorityQueue<T>(comparator);
}

void add(T t){
    if(q.size() < capacity) q.offer(t);
    else{
        if(pqc.compare(t, q.peek()) > 0){
            q.poll();
            q.offer(t);
        }
    }
}

void displayMaxHeapContent(){
    // in ascending order
    while(!q.isEmpty()) System.out.println(q.poll().toString());
}