Dans ma PriorityQueue, j'ai deux types de clients, VIP et réguliers. Je veux d'abord servir les VIP, puis les clients réguliers.
Si CustomerID < 100, il est considéré comme VIP.
Si un client est VIP, il va à la fin de la partie VIP de la file d'attente.
Si un client est régulier, il va à la fin de toute la file d'attente.
En d'autres termes, je veux trier par valeur booléenne VIP, tout en conservant l'ordre d'arrivée des clients.
Voici ma classe d'ordre
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;
}
}
Voici ma tentative pour remplir la file d'attente :
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());
}
}
}
RÉSULTAT que j'obtiens (ce qui est faux) :
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
C'est ce que je m'attendais à voir (les CustomerID 2 et 4 devraient être dans le même ordre qu'ils sont arrivés) :
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
MISE À JOUR : Je ne veux pas trier par une autre colonne que VIP. Je ne veux pas ajouter "date" parce que cela ressemble à un hack, plutôt qu'à une compréhension du fonctionnement de Java.