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 16bc3b9c..b782b615 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 @@ -30,9 +30,7 @@ public String getHaiku() public IntStream getHaikuAsChars() { - // TODO: Create an IntStream representing the chars from this.getHaiku() - // Hint: Look at the chars() method on the String class - return null; + return this.getHaiku().chars(); } public List> topLetters() @@ -72,20 +70,20 @@ public record CharCountsDuplicatesUnique( public CharCountsDuplicatesUnique duplicatesAndUnique() { - // TODO: Find all of the alphabetic letters from this.getHaikuAsChars(), convert them to lowercase - // and count and store them in a Map. - // Hint: Look at IntStream's filter, map, mapToObj - // Hint: Also Look at Stream.collect, Collectors.groupingBy, Collectors.counting - Map chars = null; - - // TODO: Find all the Characters with duplicates in the map (value > 1) - // Hint: Look at entrySet, stream, filter, collect - // Hint: Also look at Collectors.toMap and using Map.Entry.getKey and Map.Entry.getValue as method references - Map duplicates = null; - - // TODO: Find all the unique Characters in the Map (value < 2) - // Hint: Look at entrySet, stream, filter, map, Map.Entry.getKey, collect, Collectors.toSet - Set unique = null; + Map chars = this.getHaikuAsChars() + .filter(Character::isLetter) // Filter alphabetic characters + .mapToObj(ch -> (char) ch) // Convert to characters + .map(Character::toLowerCase) // Convert to lowercase + .collect(Collectors.groupingBy(c -> c, Collectors.counting())); + + Map duplicates = chars.entrySet().stream() + .filter(entry -> 1L < entry.getValue()) // Filter duplicates + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + Set unique = chars.entrySet().stream() + .filter(entry -> 2L > entry.getValue()) // Filter unique + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); // Returns a specialized "triple" type implemented as a Java Record (see CharCountsDuplicatesUnique above) return new CharCountsDuplicatesUnique(chars, duplicates, unique); 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 e2056066..4afb36cf 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 @@ -41,8 +41,8 @@ public void distinctLetters() Assertions.assertEquals("breakingthoupvmwcdflsy", distinctLetters); } -// @Test // Uncomment once duplicatesAndUnique is implemented for JDK -// @Tag("SOLUTION") + @Test + @Tag("SOLUTION") public void duplicatesAndUnique() { TextProcessorJDK.CharCountsDuplicatesUnique cdu = new TextProcessorJDK().duplicatesAndUnique();