我将使用priorityQueue实现特定的java maxHeap,如下所示: 假设我有一个“Customer”类,它有一个双变量名“marginalGain”。
PriorityQueue<Customer> marginalGainHeap=new PriorityQueue<Customer>();
如何使用“marginalGain”变量的自然顺序堆积“marginalGainHeap”?是否可以使用PriorityQueue或我需要自己重新实现MaxHeap?
问候。
答案 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());
}
}