From c5b73ec742d0522d65331ee02a143f54041845ed Mon Sep 17 00:00:00 2001 From: Alex Klymenko Date: Mon, 26 Aug 2024 16:37:17 +0200 Subject: [PATCH] refactor: `HammingDistance` (#5404) * refactor: HammingDistance * checkstyle: fix formatting --------- Co-authored-by: alxkm --- .../strings/HammingDistance.java | 41 ++++++++++++------- .../strings/HammingDistanceTest.java | 30 ++++++++++---- 2 files changed, 47 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/thealgorithms/strings/HammingDistance.java b/src/main/java/com/thealgorithms/strings/HammingDistance.java index 95c523cc..235e317d 100644 --- a/src/main/java/com/thealgorithms/strings/HammingDistance.java +++ b/src/main/java/com/thealgorithms/strings/HammingDistance.java @@ -1,34 +1,45 @@ package com.thealgorithms.strings; -/* In information theory, the Hamming distance between two strings of equal length -is the number of positions at which the corresponding symbols are different. -https://en.wikipedia.org/wiki/Hamming_distance -*/ +/** + * Class for calculating the Hamming distance between two strings of equal length. + *

+ * The Hamming distance is the number of positions at which the corresponding symbols are different. + * It is used in information theory, coding theory, and computer science. + *

+ * @see Hamming distance - Wikipedia + */ public final class HammingDistance { private HammingDistance() { } /** - * calculate the hamming distance between two strings of equal length + * Calculates the Hamming distance between two strings of equal length. + *

+ * The Hamming distance is defined only for strings of equal length. If the strings are not + * of equal length, this method throws an {@code IllegalArgumentException}. + *

* * @param s1 the first string * @param s2 the second string - * @return {@code int} hamming distance - * @throws Exception + * @return the Hamming distance between the two strings + * @throws IllegalArgumentException if the lengths of {@code s1} and {@code s2} are not equal */ - public static int calculateHammingDistance(String s1, String s2) throws Exception { - if (s1.length() != s2.length()) { - throw new Exception("String lengths must be equal"); + public static int calculateHammingDistance(String s1, String s2) { + if (s1 == null || s2 == null) { + throw new IllegalArgumentException("Strings must not be null"); } - int stringLength = s1.length(); - int counter = 0; + if (s1.length() != s2.length()) { + throw new IllegalArgumentException("String lengths must be equal"); + } - for (int i = 0; i < stringLength; i++) { + int distance = 0; + + for (int i = 0; i < s1.length(); i++) { if (s1.charAt(i) != s2.charAt(i)) { - counter++; + distance++; } } - return counter; + return distance; } } diff --git a/src/test/java/com/thealgorithms/strings/HammingDistanceTest.java b/src/test/java/com/thealgorithms/strings/HammingDistanceTest.java index e0fbdb14..5c064034 100644 --- a/src/test/java/com/thealgorithms/strings/HammingDistanceTest.java +++ b/src/test/java/com/thealgorithms/strings/HammingDistanceTest.java @@ -3,22 +3,34 @@ package com.thealgorithms.strings; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.util.stream.Stream; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.MethodSource; -public class HammingDistanceTest { +class HammingDistanceTest { - @Test - void testHammingDistance() throws Exception { - assertEquals(HammingDistance.calculateHammingDistance("", ""), 0); - assertEquals(HammingDistance.calculateHammingDistance("java", "java"), 0); - assertEquals(HammingDistance.calculateHammingDistance("karolin", "kathrin"), 3); - assertEquals(HammingDistance.calculateHammingDistance("kathrin", "kerstin"), 4); - assertEquals(HammingDistance.calculateHammingDistance("00000", "11111"), 5); + @ParameterizedTest + @CsvSource({"'', '', 0", "'java', 'java', 0", "'karolin', 'kathrin', 3", "'kathrin', 'kerstin', 4", "'00000', '11111', 5", "'10101', '10100', 1"}) + void testHammingDistance(String s1, String s2, int expected) { + assertEquals(expected, HammingDistance.calculateHammingDistance(s1, s2)); + } + + @ParameterizedTest + @MethodSource("provideNullInputs") + void testHammingDistanceWithNullInputs(String input1, String input2) { + assertThrows(IllegalArgumentException.class, () -> HammingDistance.calculateHammingDistance(input1, input2)); + } + + private static Stream provideNullInputs() { + return Stream.of(Arguments.of(null, "abc"), Arguments.of("abc", null), Arguments.of(null, null)); } @Test void testNotEqualStringLengths() { - Exception exception = assertThrows(Exception.class, () -> HammingDistance.calculateHammingDistance("ab", "abc")); + Exception exception = assertThrows(IllegalArgumentException.class, () -> HammingDistance.calculateHammingDistance("ab", "abc")); assertEquals("String lengths must be equal", exception.getMessage()); } }