Advertisement
thewitchking

Untitled

Jun 19th, 2025
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.53 KB | None | 0 0
  1. public static List<Settlement> simplifyDebts(Map<String, Double> netBalances) {
  2.  
  3.         // Max-heap for creditors
  4.         PriorityQueue<UserBalance> creditors = new PriorityQueue<>(
  5.             (a, b) -> Double.compare(b.amount, a.amount)
  6.         );
  7.  
  8.         // Min-heap for debtors
  9.         PriorityQueue<UserBalance> debtors = new PriorityQueue<>(
  10.             Comparator.comparingDouble(a -> a.amount)
  11.         );
  12.  
  13.         // Divide users into creditors and debtors
  14.         for (Map.Entry<String, Double> entry : netBalances.entrySet()) {
  15.             if (entry.getValue() > 0) {
  16.                 creditors.add(new UserBalance(entry.getKey(), entry.getValue()));
  17.             } else if (entry.getValue() < 0) {
  18.                 debtors.add(new UserBalance(entry.getKey(), entry.getValue()));
  19.             }
  20.         }
  21.  
  22.         List<Settlement> settlements = new ArrayList<>();
  23.  
  24.         while (!creditors.isEmpty() && !debtors.isEmpty()) {
  25.             UserBalance creditor = creditors.poll();
  26.             UserBalance debtor = debtors.poll();
  27.  
  28.             double settlementAmount = Math.min(creditor.amount, -debtor.amount);
  29.  
  30.             settlements.add(new Settlement(debtor.user, creditor.user, settlementAmount));
  31.  
  32.             creditor.amount -= settlementAmount;
  33.             debtor.amount += settlementAmount;
  34.  
  35.             // Push them back if there's remaining balance
  36.             if (creditor.amount > 0) creditors.add(creditor);
  37.             if (debtor.amount < 0) debtors.add(debtor);
  38.         }
  39.  
  40.         return settlements;
  41.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement