From 4577511760f0cce1d5b86d89cdaa6fabe068c7dd Mon Sep 17 00:00:00 2001 From: rsp2210 Date: Fri, 22 Sep 2023 17:04:28 -0700 Subject: [PATCH] Added Implementation of TextProcessorJDK.topVowelAndConsonant() Added the suggested changes --- .../haikukata/TextProcessorJDK.java | 57 +++++++++++-------- .../haikukata/TextProcessorJDKTest.java | 4 +- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/haiku-kata-solutions/src/main/java/org/eclipse/collections/haikukata/TextProcessorJDK.java b/haiku-kata-solutions/src/main/java/org/eclipse/collections/haikukata/TextProcessorJDK.java index b782b615..3a50395f 100644 --- a/haiku-kata-solutions/src/main/java/org/eclipse/collections/haikukata/TextProcessorJDK.java +++ b/haiku-kata-solutions/src/main/java/org/eclipse/collections/haikukata/TextProcessorJDK.java @@ -94,36 +94,43 @@ public CharCountsDuplicatesUnique duplicatesAndUnique() */ public record TopVowelAndConsonant(char vowel, char consonant) {}; - public TopVowelAndConsonant topVowelAndConsonant() - { - // TODO: Find all of the alphabetic letters from this.getHaikuAsChars(), convert them to lowercase, - // TODO: count the Character values in a Map and create a List of top 26 occurrences in - // TODO: Map.Entry instances sorted in reverse order by count - // Hint: Look at filter, map, mapToObj, collect, Collectors.groupingBy, Collectors.counting - // Hint: Also look at entrySet, stream, sorted, Map.Entry.comparingByValue, Comparator.reverseorder, toList - List> entries = null; - - // TODO: Find the top vowel - // Hint: Use the filter method with findFirst, orElseThrow on Stream with the isVowel method below to find - // Hint: the top vowel Character value using getKey on Map.Entry. - char topVowel = 'a'; - - // TODO: Find the top consonant - // Hint: Use the filter method with findFirst, orElseThrow on Stream with the isVowel method below to find - // Hint: the top consonant Character value using getKey on Map.Entry. - char topConsonant = 'b'; + public TopVowelAndConsonant topVowelAndConsonant() { + // Find all of the alphabetic letters from the haiku, convert them to lowercase, + // and count the Character values in a Map. + Map charCounts = this.getHaikuAsChars() + .filter(Character::isAlphabetic) // Filter non-alphabetic characters first + .mapToObj(ch -> (char) ch) + .map(Character::toLowerCase) + .collect(Collectors.groupingBy(c -> c, Collectors.counting())); + + // Create a List of the top 26 occurrences in Map.Entry instances sorted in reverse order by count. + List> entries = charCounts.entrySet() + .stream() + .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) + .collect(Collectors.toList()); + + // Find the top vowel. + char topVowel = entries.stream() + .filter(entry -> isVowel(entry.getKey())) + .findFirst() + .orElseThrow(() -> new RuntimeException("No vowels found in haiku")) + .getKey(); + + // Find the top consonant. + char topConsonant = entries.stream() + .filter(entry -> !isVowel(entry.getKey())) + .findFirst() + .orElseThrow(() -> new RuntimeException("No consonants found in haiku")) + .getKey(); // Return a specialized "pair" instance named TopVowelAndConsonant implemented via a Java Record return new TopVowelAndConsonant(topVowel, topConsonant); } - public boolean isVowel(char character) - { - // TODO: Use a Switch Expression to test for lowercase and uppercase vowels. - return switch (character) - { - case 'a', 'b', 'c' -> false; - default -> true; + public boolean isVowel(char character) { + return switch (character) { + case 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' -> true; + default -> false; }; } diff --git a/haiku-kata-solutions/src/test/java/org/eclipse/collections/haikukata/TextProcessorJDKTest.java b/haiku-kata-solutions/src/test/java/org/eclipse/collections/haikukata/TextProcessorJDKTest.java index 4afb36cf..23cf9b6b 100644 --- a/haiku-kata-solutions/src/test/java/org/eclipse/collections/haikukata/TextProcessorJDKTest.java +++ b/haiku-kata-solutions/src/test/java/org/eclipse/collections/haikukata/TextProcessorJDKTest.java @@ -51,8 +51,8 @@ public void duplicatesAndUnique() Assertions.assertEquals(Set.of(), cdu.unique()); } -// @Test // Uncomment once topVowelAndConsonant is implemented for JDK -// @Tag("SOLUTION") + @Test + @Tag("SOLUTION") public void topVowelAndConsonant() { TextProcessorJDK.TopVowelAndConsonant vowelAndConsonant = new TextProcessorJDK().topVowelAndConsonant();