使用priorityQueue实现特定的java MaxHeap

时间:2014-02-22 10:59:41

标签: java heap heapsort

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

PriorityQueue<Customer> marginalGainHeap=new PriorityQueue<Customer>();

如何使用“marginalGain”变量的自然顺序堆积“marginalGainHeap”?是否可以使用PriorityQueue或我需要自己重新实现MaxHeap?

问候。

2 个答案:

答案 0 :(得分:1)

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

在任何情况下,您都需要使客户可比较,或者更好的解决方案更有可能创建Comparator<Customer>,因为您可能希望按多个订单对客户进行排序。注意:您需要订购所有客户,即使他们的marginGain相同,您需要向他们下订单。

您可以像这样使用带有PriorityQueue的比较器。

PriorityQueue<Customer> pq = new PriorityQueue<Customer>(new Comparator<Customer>() {
    public int compare(Customer c1, Customer c2) {
       return Double.compare(c1.getMarginGain(), c2.getMarginGain());
    }
});

PriorityQueue的一个优点是您不必确保比较器不会为不同的客户返回0(在TreeSet中它会将这些作为重复项并将其丢弃)

答案 1 :(得分:0)

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

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

}