From 53dbea8d568045bc501da756d720e202368c2da7 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sun, 27 Nov 2022 20:00:09 +0100 Subject: [PATCH] BAEL-5921 | Guide to Java Priority Queue (#13087) * BAEL-5921 | Guide to Java Priority Queue * BAEL-5921 | Adressed comments * BAEL-5921 | Fixed test * BAEL-5921 | Fixed test --- .../priorityqueue/ColoredNumber.java | 27 +++++++ .../ColoredNumberComparable.java | 44 +++++++++++ .../PriorityQueueComparatorUnitTest.java | 74 +++++++++++++++++++ 3 files changed, 145 insertions(+) create mode 100644 core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumber.java create mode 100644 core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumberComparable.java create mode 100644 core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/priorityqueue/PriorityQueueComparatorUnitTest.java diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumber.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumber.java new file mode 100644 index 0000000000..554a13d642 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumber.java @@ -0,0 +1,27 @@ +package com.baeldung.collections.priorityqueue; + +public final class ColoredNumber { + private int value; + private String color; + + public ColoredNumber(int value, String color) { + this.value = value; + this.color = color; + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } +} diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumberComparable.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumberComparable.java new file mode 100644 index 0000000000..0e9a5ec498 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/priorityqueue/ColoredNumberComparable.java @@ -0,0 +1,44 @@ +package com.baeldung.collections.priorityqueue; + +public final class ColoredNumberComparable implements Comparable { + private int value; + private String color; + + public ColoredNumberComparable(int value, String color) { + this.value = value; + this.color = color; + } + + @Override + public int compareTo(ColoredNumberComparable o) { + // (both numbers are red) or (both numbers are not red) + if ((this.color.equals("red") && o.color.equals("red")) || + (!this.color.equals("red") && !o.color.equals("red"))) { + return Integer.compare(this.value, o.value); + } + // only the first number is red + else if (this.color.equals("red")) { + return -1; + } + // only the second number is red + else { + return 1; + } + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/priorityqueue/PriorityQueueComparatorUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/priorityqueue/PriorityQueueComparatorUnitTest.java new file mode 100644 index 0000000000..db10fa1ae8 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/collections/priorityqueue/PriorityQueueComparatorUnitTest.java @@ -0,0 +1,74 @@ +package com.baeldung.collections.priorityqueue; + +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.PriorityQueue; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class PriorityQueueComparatorUnitTest { + + @Test + void givenIntegerQueue_defaultComparator_followsNaturalOrdering() { + PriorityQueue integerQueue = new PriorityQueue<>(); + PriorityQueue integerQueueWithComparator = new PriorityQueue<>((Integer c1, Integer c2) -> Integer.compare(c1, c2)); + + integerQueueWithComparator.add(3); + integerQueue.add(3); + + integerQueueWithComparator.add(2); + integerQueue.add(2); + + integerQueueWithComparator.add(1); + integerQueue.add(1); + + assertThat(integerQueue.poll()).isEqualTo(1).isEqualTo(integerQueueWithComparator.poll()); + assertThat(integerQueue.poll()).isEqualTo(2).isEqualTo(integerQueueWithComparator.poll()); + assertThat(integerQueue.poll()).isEqualTo(3).isEqualTo(integerQueueWithComparator.poll()); + } + + @Test + void givenIntegerQueue_reverseOrderComparator_followsInverseNaturalOrdering() { + PriorityQueue reversedQueue = new PriorityQueue<>(Collections.reverseOrder()); + + reversedQueue.add(1); + reversedQueue.add(2); + reversedQueue.add(3); + + assertThat(reversedQueue.poll()).isEqualTo(3); + assertThat(reversedQueue.poll()).isEqualTo(2); + assertThat(reversedQueue.poll()).isEqualTo(1); + } + + @Test + void givenNotComparableQueue_classCastException() { + assertThatThrownBy(() -> { + PriorityQueue queue = new PriorityQueue<>(); + queue.add(new ColoredNumber(3, "red")); + queue.add(new ColoredNumber(2, "blue")); + }).isInstanceOf(ClassCastException.class); + } + + @Test + void givenCustomOrderingQueue_orderIsCorrect() { + PriorityQueue queue = new PriorityQueue<>(); + queue.add(new ColoredNumberComparable(10, "red")); + queue.add(new ColoredNumberComparable(20, "red")); + queue.add(new ColoredNumberComparable(1, "blue")); + queue.add(new ColoredNumberComparable(2, "blue")); + + ColoredNumberComparable first = queue.poll(); + assertThat(first.getColor()).isEqualTo("red"); + assertThat(first.getValue()).isEqualTo(10); + + queue.poll(); + + ColoredNumberComparable third = queue.poll(); + assertThat(third.getColor()).isEqualTo("blue"); + assertThat(third.getValue()).isEqualTo(1); + } + +} +