diff --git a/src/CharacterFrequencyCounter.java b/src/CharacterFrequencyCounter.java index d4e09c1..5944c89 100644 --- a/src/CharacterFrequencyCounter.java +++ b/src/CharacterFrequencyCounter.java @@ -2,9 +2,12 @@ import java.util.Map; /** - * The CharacterFrequencyCounter class analyzes a given string to count the frequency - * of characters (letters and digits ONLY) in a case-insensitive manner. It provides methods - * to get the frequency of a specific character, retrieve the full frequency map, and + * The CharacterFrequencyCounter class analyzes a given string to count the + * frequency + * of characters (letters and digits ONLY) in a case-insensitive manner. It + * provides methods + * to get the frequency of a specific character, retrieve the full frequency + * map, and * calculate the relative percentage of a character's occurrence. */ public class CharacterFrequencyCounter { @@ -32,7 +35,7 @@ public CharacterFrequencyCounter(String input) { private void processString(String input) { for (char c : input.toCharArray()) { if (Character.isLetterOrDigit(c)) { // Count only letters and digits - c = Character.toLowerCase(c); // Case insensitive counting + c = Character.toLowerCase(c); // Case insensitive counting frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1); totalCharacterCount++; } @@ -47,20 +50,25 @@ private void processString(String input) { * @return the frequency of the specified character, or 0 if it is not present */ public int getFrequency(char c) { - c = Character.toLowerCase(c); // Case insensitive lookup + c = Character.toLowerCase(c); // Case insensitive lookup return frequencyMap.getOrDefault(c, 0); } /** - * Returns the relative percentage of a character's occurrence in the input string. - * The percentage is calculated as (character's frequency / total characters) * 100. + * Returns the relative percentage of a character's occurrence in the input + * string. + * The percentage is calculated as (character's frequency / total characters) * + * 100. * * @param c the character to calculate the relative percentage for * @return the relative percentage of the character's occurrence in the string */ public double getRelativePercentage(char c) { c = Character.toLowerCase(c); - int charCount = frequencyMap.get(c); + int charCount = 0; + if (frequencyMap.get(c) != null) { + charCount = frequencyMap.get(c); + } return ((double) charCount / totalCharacterCount) * 100; } diff --git a/src/CharacterFrequencyCounterTest.java b/src/CharacterFrequencyCounterTest.java index bed3ee2..ccb45d2 100644 --- a/src/CharacterFrequencyCounterTest.java +++ b/src/CharacterFrequencyCounterTest.java @@ -3,5 +3,23 @@ import org.junit.jupiter.api.Test; public class CharacterFrequencyCounterTest { - + @Test + public void testLAppearsThreeTimesInHelloWorld() { + // Arrange + CharacterFrequencyCounter counter = new CharacterFrequencyCounter("hello world"); + // Act + int actualCount = counter.getFrequency('l'); + // Assert + assertEquals(3, actualCount); + } + + @Test + public void testNonOccurringCharacterPercentageIsZero() { + // Arrange + CharacterFrequencyCounter counter = new CharacterFrequencyCounter("hi there"); + // Act + double actualPercentage = counter.getRelativePercentage('z'); + // Assert + assertEquals(0.0, actualPercentage, 0.0001); + } } \ No newline at end of file