在我的优先队列中,有两种类型的客户:VIP和普通。我想先为VIP服务,然后为普通客户服务。
如果CustomerID < 100,则被视为VIP。
如果顾客是VIP,则他排在队列的VIP部分的末尾。
如果顾客是普通顾客,则他排在整个队列的末尾。
换句话说,我想按照布尔VIP值进行排序,同时保留顾客进来的顺序。
这是我的Order类。
这就是我所期望看到的结果(客户ID 2和4应该按照他们的顺序排列):
如果CustomerID < 100,则被视为VIP。
如果顾客是VIP,则他排在队列的VIP部分的末尾。
如果顾客是普通顾客,则他排在整个队列的末尾。
换句话说,我想按照布尔VIP值进行排序,同时保留顾客进来的顺序。
这是我的Order类。
public class Order implements Comparable<Order> {
private final int customerID;
private final int amount;
private final boolean vip_status;
public Order(int customerID, int amount) {
this.customerID = customerID;
this.amount = amount;
this.vip_status = customerID < 100 ? true : false;
}
@Override
public int compareTo(Order o) {
if (vip_status && !o.vip_status) {
return -1;
}
if (!vip_status && o.vip_status)
return 1;
return 0;
}
public int getCustomerID() {
return customerID;
}
public int getAmount() {
return amount;
}
public boolean isVip_status() {
return vip_status;
}
}
这是我填充队列的尝试:
import java.util.PriorityQueue;
public class MyPriorityQueue {
public static void main(String[] args) {
PriorityQueue<Order> queue = new PriorityQueue<>();
Order o1 = new Order(1, 50);
Order o2 = new Order(5, 30);
Order o3 = new Order(4, 10);
Order o4 = new Order(150, 5);
Order o5 = new Order(2, 5);
Order o6 = new Order(200, 5);
queue.add(o1);
queue.add(o2);
queue.add(o3);
queue.add(o4);
queue.add(o5);
queue.add(o6);
while(!queue.isEmpty()){
Order s = queue.poll();
System.out.printf("VIP Status: %s CustomerID: %s Amount: %s%n",
s.isVip_status(), s.getCustomerID(), s.getAmount());
}
}
}
我得到的结果(是错误的):
VIP Status: true CustomerID: 1 Amount: 50
VIP Status: true CustomerID: 5 Amount: 30
VIP Status: true CustomerID: 2 Amount: 5
VIP Status: true CustomerID: 4 Amount: 10
VIP Status: false CustomerID: 150 Amount: 5
VIP Status: false CustomerID: 200 Amount: 5
这就是我所期望看到的结果(客户ID 2和4应该按照他们的顺序排列):
VIP Status: true CustomerID: 1 Amount: 50
VIP Status: true CustomerID: 5 Amount: 30
VIP Status: true CustomerID: 4 Amount: 10
VIP Status: true CustomerID: 2 Amount: 5
VIP Status: false CustomerID: 150 Amount: 5
VIP Status: false CustomerID: 200 Amount: 5
更新:我不想按照除"VIP"之外的任何其他列进行排序。我也不想添加"date",因为这感觉像是一个hack,而不是真正理解Java的工作原理。
return 0;
更改为return Integer.compare(amount, o.amount);
。 - Hovercraft Full Of EelsComparator
中实现。通常,自然顺序应该考虑所有变量,就像通过equals
方法一样。可以参考Comparable
文档以获取更详细的解释。 - RadiodefPriorityBlockingQueue
的一段摘录,官方推荐类似这样的做法。 - Radiodef