diff --git a/src/main/java/com/thealgorithms/others/CountWords.java b/src/main/java/com/thealgorithms/others/CountWords.java index 26b9c50d..515c5d33 100644 --- a/src/main/java/com/thealgorithms/others/CountWords.java +++ b/src/main/java/com/thealgorithms/others/CountWords.java @@ -8,17 +8,26 @@ public final class CountWords { } /** - * @brief counts the number of words in the input string + * Counts the number of words in the input string. Words are defined as sequences of + * characters separated by whitespace. + * * @param s the input string - * @return the number of words in the input string + * @return the number of words in the input string, or 0 if the string is null or empty */ public static int wordCount(String s) { if (s == null || s.isEmpty()) { return 0; } - return s.trim().split("[\\s]+").length; + return s.trim().split("\\s+").length; } + /** + * Removes all special characters from the input string, leaving only alphanumeric characters + * and whitespace. + * + * @param s the input string + * @return a string containing only alphanumeric characters and whitespace + */ private static String removeSpecialCharacters(String s) { StringBuilder sb = new StringBuilder(); for (char c : s.toCharArray()) { @@ -30,12 +39,12 @@ public final class CountWords { } /** - * counts the number of words in a sentence but ignores all potential - * non-alphanumeric characters that do not represent a word. runs in O(n) - * where n is the length of s + * Counts the number of words in a sentence, ignoring all non-alphanumeric characters that do + * not contribute to word formation. This method has a time complexity of O(n), where n is the + * length of the input string. * - * @param s String: sentence with word(s) - * @return int: number of words + * @param s the input string + * @return the number of words in the input string, with special characters removed, or 0 if the string is null */ public static int secondaryWordCount(String s) { if (s == null) { diff --git a/src/test/java/com/thealgorithms/others/CountWordsTest.java b/src/test/java/com/thealgorithms/others/CountWordsTest.java index d5ebe654..17bb3aa6 100644 --- a/src/test/java/com/thealgorithms/others/CountWordsTest.java +++ b/src/test/java/com/thealgorithms/others/CountWordsTest.java @@ -2,36 +2,30 @@ package com.thealgorithms.others; import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.HashMap; -import org.junit.jupiter.api.Test; +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; class CountWordsTest { - @Test - public void testWordCount() { - HashMap testCases = new HashMap<>(); - testCases.put("", 0); - testCases.put(null, 0); - testCases.put("aaaa bbb cccc", 3); - testCases.put("note extra spaces here", 4); - testCases.put(" a b c d e ", 5); - for (final var tc : testCases.entrySet()) { - assertEquals(CountWords.wordCount(tc.getKey()), tc.getValue()); - } + @ParameterizedTest + @MethodSource("wordCountTestCases") + void testWordCount(String input, int expectedCount) { + assertEquals(expectedCount, CountWords.wordCount(input)); } - @Test - public void testSecondaryWordCount() { - HashMap testCases = new HashMap<>(); - testCases.put("", 0); - testCases.put(null, 0); - testCases.put("aaaa bbb cccc", 3); - testCases.put("this-is-one-word!", 1); - testCases.put("What, about, this? Hmmm----strange", 4); - testCases.put("word1 word-2 word-3- w?o,r.d.@!@#$&*()<>4", 4); + @ParameterizedTest + @MethodSource("secondaryWordCountTestCases") + void testSecondaryWordCount(String input, int expectedCount) { + assertEquals(expectedCount, CountWords.secondaryWordCount(input)); + } - for (final var tc : testCases.entrySet()) { - assertEquals(CountWords.secondaryWordCount(tc.getKey()), tc.getValue()); - } + private static Stream wordCountTestCases() { + return Stream.of(Arguments.of("", 0), Arguments.of(null, 0), Arguments.of("aaaa bbb cccc", 3), Arguments.of("note extra spaces here", 4), Arguments.of(" a b c d e ", 5)); + } + + private static Stream secondaryWordCountTestCases() { + return Stream.of(Arguments.of("", 0), Arguments.of(null, 0), Arguments.of("aaaa bbb cccc", 3), Arguments.of("this-is-one-word!", 1), Arguments.of("What, about, this? Hmmm----strange", 4), Arguments.of("word1 word-2 word-3- w?o,r.d.@!@#$&*()<>4", 4)); } }