In my PriorityQueue, I have 2 types of clients, VIP and regular. I want to serve the VIP first, and then regularly.
If CustomerID <100 is considered VIP.
If the client is VIP, he goes at the end of the VIP part of the queue
If the customer is constant, he goes to the end of the line.
In other words, I want to sort by boolean VIP value, while preserving the order in which the clients entered.
Here is my class
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; } }
Here is my attempt to fill the queue:
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()); } } }
RESULT I get (which is wrong):
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
This is what I expected to see (CustomerID 2 and 4 should be in the same order they entered):
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
UPDATE: I do not want to sort by any column other than VIP. I donโt want to add a โdateโ because it seems like a hack, not an understanding of how Java works.