diff --git a/src/main/java/com/thealgorithms/others/cn/ComputeHammingHandler.java b/src/main/java/com/thealgorithms/others/cn/ComputeHammingHandler.java new file mode 100644 index 000000000000..4f5f586557cf --- /dev/null +++ b/src/main/java/com/thealgorithms/others/cn/ComputeHammingHandler.java @@ -0,0 +1,12 @@ +package com.thealgorithms.others.cn; +public class ComputeHammingHandler extends HammingHandler { + + @Override + public Object handle(String bitsStrA, String bitsStrB) { + int totalErrorBitCount = 0; + for (int i = 0; i < bitsStrA.length(); i++) { + totalErrorBitCount += bitsStrA.charAt(i) == bitsStrB.charAt(i) ? 0 : 1; + } + return totalErrorBitCount; + } +} diff --git a/src/main/java/com/thealgorithms/others/cn/HammingDistance.java b/src/main/java/com/thealgorithms/others/cn/HammingDistance.java index c8239d53d606..b5563563b49e 100644 --- a/src/main/java/com/thealgorithms/others/cn/HammingDistance.java +++ b/src/main/java/com/thealgorithms/others/cn/HammingDistance.java @@ -1,32 +1,14 @@ package com.thealgorithms.others.cn; public final class HammingDistance { - private HammingDistance() { - } - - private static void checkChar(char inChar) { - if (inChar != '0' && inChar != '1') { - throw new IllegalArgumentException("Input must be a binary string."); - } - } - public static int compute(char charA, char charB) { - checkChar(charA); - checkChar(charB); - return charA == charB ? 0 : 1; + private HammingDistance() { } public static int compute(String bitsStrA, String bitsStrB) { - if (bitsStrA.length() != bitsStrB.length()) { - throw new IllegalArgumentException("Input strings must have the same length."); - } - - int totalErrorBitCount = 0; - - for (int i = 0; i < bitsStrA.length(); i++) { - totalErrorBitCount += compute(bitsStrA.charAt(i), bitsStrB.charAt(i)); - } + HammingHandler chain = new ValidateBinaryHandler(); + chain.setNext(new ValidateLengthHandler()).setNext(new ComputeHammingHandler()); - return totalErrorBitCount; + return (int) chain.handle(bitsStrA, bitsStrB); } } diff --git a/src/main/java/com/thealgorithms/others/cn/HammingHandler.java b/src/main/java/com/thealgorithms/others/cn/HammingHandler.java new file mode 100644 index 000000000000..9d1f833f9a59 --- /dev/null +++ b/src/main/java/com/thealgorithms/others/cn/HammingHandler.java @@ -0,0 +1,11 @@ +package com.thealgorithms.others.cn; +public abstract class HammingHandler { + protected HammingHandler next; + + public HammingHandler setNext(HammingHandler next) { + this.next = next; + return next; + } + + public abstract Object handle(String bitsStrA, String bitsStrB); +} diff --git a/src/main/java/com/thealgorithms/others/cn/ValidateBinaryHandler.java b/src/main/java/com/thealgorithms/others/cn/ValidateBinaryHandler.java new file mode 100644 index 000000000000..d9d1884dff21 --- /dev/null +++ b/src/main/java/com/thealgorithms/others/cn/ValidateBinaryHandler.java @@ -0,0 +1,18 @@ +package com.thealgorithms.others.cn; +public class ValidateBinaryHandler extends HammingHandler { + + private void checkBinary(String str) { + for (char c : str.toCharArray()) { + if (c != '0' && c != '1') { + throw new IllegalArgumentException("Input must be a binary string."); + } + } + } + + @Override + public Object handle(String bitsStrA, String bitsStrB) { + checkBinary(bitsStrA); + checkBinary(bitsStrB); + return next.handle(bitsStrA, bitsStrB); + } +} diff --git a/src/main/java/com/thealgorithms/others/cn/ValidateLengthHandler.java b/src/main/java/com/thealgorithms/others/cn/ValidateLengthHandler.java new file mode 100644 index 000000000000..df38ed4f1cec --- /dev/null +++ b/src/main/java/com/thealgorithms/others/cn/ValidateLengthHandler.java @@ -0,0 +1,11 @@ +package com.thealgorithms.others.cn; +public class ValidateLengthHandler extends HammingHandler { + + @Override + public Object handle(String bitsStrA, String bitsStrB) { + if (bitsStrA.length() != bitsStrB.length()) { + throw new IllegalArgumentException("Input strings must have the same length."); + } + return next.handle(bitsStrA, bitsStrB); + } +} diff --git a/src/test/java/com/thealgorithms/others/cn/ComputeHammingHandlerTest.java b/src/test/java/com/thealgorithms/others/cn/ComputeHammingHandlerTest.java new file mode 100644 index 000000000000..ceaccef03885 --- /dev/null +++ b/src/test/java/com/thealgorithms/others/cn/ComputeHammingHandlerTest.java @@ -0,0 +1,21 @@ +package com.thealgorithms.others.cn; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ComputeHammingHandlerTest { + + private final ComputeHammingHandler handler = new ComputeHammingHandler(); + + @Test + public void testHammingDistanceComputation() { + Object result = handler.handle("1101", "1001"); + Assertions.assertThat(result).isEqualTo(1); + } + + @Test + public void identicalStringsShouldReturnZero() { + Object result = handler.handle("1111", "1111"); + Assertions.assertThat(result).isEqualTo(0); + } +} diff --git a/src/test/java/com/thealgorithms/others/cn/MockHammingHandler.java b/src/test/java/com/thealgorithms/others/cn/MockHammingHandler.java new file mode 100644 index 000000000000..fd49e4952ae8 --- /dev/null +++ b/src/test/java/com/thealgorithms/others/cn/MockHammingHandler.java @@ -0,0 +1,13 @@ +package com.thealgorithms.others.cn; +public class MockHammingHandler extends HammingHandler { + private final Object returnValue; + + public MockHammingHandler(Object returnValue) { + this.returnValue = returnValue; + } + + @Override + public Object handle(String a, String b) { + return returnValue; + } +} diff --git a/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java b/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java new file mode 100644 index 000000000000..2837d1c8990d --- /dev/null +++ b/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java @@ -0,0 +1,21 @@ +package com.thealgorithms.others.cn; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ValidateBinaryHandlerTest { + + private final ValidateBinaryHandler handler = new ValidateBinaryHandler(); + + @Test + public void validBinaryStringsShouldPass() { + handler.setNext(new MockHammingHandler("PASSED")); + Object result = handler.handle("1010", "0110"); + Assertions.assertThat(result).isEqualTo("PASSED"); + } + + @Test + public void invalidBinaryShouldThrowException() { + Assertions.assertThatThrownBy(() -> handler.handle("10A0", "0110")).isInstanceOf(IllegalArgumentException.class).hasMessageContaining("binary string"); + } +} diff --git a/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java b/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java new file mode 100644 index 000000000000..45bf65c82dc5 --- /dev/null +++ b/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java @@ -0,0 +1,21 @@ +package com.thealgorithms.others.cn; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ValidateLengthHandlerTest { + + private final ValidateLengthHandler handler = new ValidateLengthHandler(); + + @Test + public void validLengthShouldPass() { + handler.setNext(new MockHammingHandler("LENGTH_OK")); + Object result = handler.handle("1010", "0110"); + Assertions.assertThat(result).isEqualTo("LENGTH_OK"); + } + + @Test + public void mismatchedLengthShouldThrowException() { + Assertions.assertThatThrownBy(() -> handler.handle("101", "10")).isInstanceOf(IllegalArgumentException.class).hasMessageContaining("same length"); + } +}
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: