From fd890ab974a60188b9c53d3e76c01fa0eb511ba1 Mon Sep 17 00:00:00 2001 From: Trishun Date: Sun, 23 Oct 2022 22:47:59 +0200 Subject: [PATCH] Resolves Java Priority Queue Task --- .../priority_queue/Solution.java | 85 +++++++++++++++++++ .../training/hackerrank/HackerRankTest.java | 7 ++ .../hackerrank/SolutionClassDescription.java | 2 +- .../priority_queue/SolutionTest.java | 47 ++++++++++ 4 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 src/main/java/eu/ztsh/training/hackerrank/datastructures/priority_queue/Solution.java create mode 100644 src/test/java/eu/ztsh/training/hackerrank/datastructures/priority_queue/SolutionTest.java diff --git a/src/main/java/eu/ztsh/training/hackerrank/datastructures/priority_queue/Solution.java b/src/main/java/eu/ztsh/training/hackerrank/datastructures/priority_queue/Solution.java new file mode 100644 index 0000000..f636c45 --- /dev/null +++ b/src/main/java/eu/ztsh/training/hackerrank/datastructures/priority_queue/Solution.java @@ -0,0 +1,85 @@ +package eu.ztsh.training.hackerrank.datastructures.priority_queue; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.PriorityQueue; +import java.util.Scanner; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +class Priorities { + + List getStudents(List events) { + var queue = new PriorityQueue<>(events.size(), + Comparator.comparingDouble(Student::getCGPA) + .reversed() // CGPA is the only descending here + .thenComparing(Student::getName) + .thenComparing(Student::getID)); + events.forEach(event -> { + var line = event.split(" "); + switch (line[0]) { + case "ENTER" -> + queue.add(new Student(Integer.parseInt(line[3]), line[1], Double.parseDouble(line[2]))); + case "SERVED" -> queue.poll(); + default -> throw new IllegalArgumentException(); + } + }); + return Stream.generate(queue::poll).takeWhile(Objects::nonNull).collect(Collectors.toList()); + } + +} + +class Student { + + Student(int id, String name, double cgpa) { + this.id = id; + this.name = name; + this.cgpa = cgpa; + } + + int getID() { + return id; + } + + String getName() { + return name; + } + + double getCGPA() { + return cgpa; + } + + private final int id; + private final String name; + private final double cgpa; + +} + +// https://www.hackerrank.com/challenges/java-priority-queue/problem +public class Solution { + + public static void main(String[] args) { + int totalEvents = Integer.parseInt(scan.nextLine()); + List events = new ArrayList<>(); + + while (totalEvents-- != 0) { + String event = scan.nextLine(); + events.add(event); + } + + List students = priorities.getStudents(events); + + if (students.isEmpty()) { + System.out.println("EMPTY"); + } else { + for (Student st : students) { + System.out.println(st.getName()); + } + } + } + private static Scanner scan = new Scanner(System.in); + private final static Priorities priorities = new Priorities(); + +} diff --git a/src/test/java/eu/ztsh/training/hackerrank/HackerRankTest.java b/src/test/java/eu/ztsh/training/hackerrank/HackerRankTest.java index cf59987..7c518cc 100644 --- a/src/test/java/eu/ztsh/training/hackerrank/HackerRankTest.java +++ b/src/test/java/eu/ztsh/training/hackerrank/HackerRankTest.java @@ -10,6 +10,8 @@ import java.util.List; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import static org.assertj.core.api.Assertions.assertThat; + public abstract class HackerRankTest { @BeforeAll @@ -25,6 +27,11 @@ public abstract class HackerRankTest { System.setIn(originalIn); } + protected void simpleAssert(List input, List expected) { + var result = invoke(input); + assertThat(result).containsExactlyElementsOf(expected); + } + protected List invoke(List input) { try { outContent.reset(); diff --git a/src/test/java/eu/ztsh/training/hackerrank/SolutionClassDescription.java b/src/test/java/eu/ztsh/training/hackerrank/SolutionClassDescription.java index b141262..ced0393 100644 --- a/src/test/java/eu/ztsh/training/hackerrank/SolutionClassDescription.java +++ b/src/test/java/eu/ztsh/training/hackerrank/SolutionClassDescription.java @@ -4,7 +4,7 @@ import java.util.Arrays; public record SolutionClassDescription(Class targetClass, String fieldName, FieldModifier[] modifiers) { - SolutionClassDescription(Class targetClass) { + public SolutionClassDescription(Class targetClass) { this(targetClass, null, null); } diff --git a/src/test/java/eu/ztsh/training/hackerrank/datastructures/priority_queue/SolutionTest.java b/src/test/java/eu/ztsh/training/hackerrank/datastructures/priority_queue/SolutionTest.java new file mode 100644 index 0000000..1e2c7ab --- /dev/null +++ b/src/test/java/eu/ztsh/training/hackerrank/datastructures/priority_queue/SolutionTest.java @@ -0,0 +1,47 @@ +package eu.ztsh.training.hackerrank.datastructures.priority_queue; + +import java.util.List; +import eu.ztsh.training.hackerrank.HackerRankTest; +import eu.ztsh.training.hackerrank.SolutionClassDescription; +import eu.ztsh.training.hackerrank.SolutionClassDescription.FieldModifier; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("HackerRank chalenges: Java Priority Queue") +class SolutionTest extends HackerRankTest { + + @Test + public void testCase0() { + var input = List.of( + "12", + "ENTER John 3.75 50", + "ENTER Mark 3.8 24", + "ENTER Shafaet 3.7 35", + "SERVED", + "SERVED", + "ENTER Samiha 3.85 36", + "SERVED", + "ENTER Ashley 3.9 42", + "ENTER Maria 3.6 46", + "ENTER Anik 3.95 49", + "ENTER Dan 3.95 50", + "SERVED" + ); + var expected = List.of( + "Dan", + "Ashley", + "Shafaet", + "Maria" + ); + simpleAssert(input, expected); + } + + + @Override + protected SolutionClassDescription getSolutionClassDescription() { + return new SolutionClassDescription(Solution.class, + "scan", + new FieldModifier[]{FieldModifier.PRIVATE, FieldModifier.STATIC}); + } + +} \ No newline at end of file