From d5423f54c3be7ef4caa2116b5c2986da64094031 Mon Sep 17 00:00:00 2001 From: dinishajais Date: Sun, 27 Jul 2025 06:46:58 +0530 Subject: [PATCH 1/6] Improvement of Hamming Distance class --- .../others/cn/ComputeHammingHandler.java | 12 +++++++ .../others/cn/HammingDistance.java | 32 ++++--------------- .../others/cn/HammingHandler.java | 11 +++++++ .../others/cn/ValidateBinaryHandler.java | 18 +++++++++++ .../others/cn/ValidateLengthHandler.java | 11 +++++++ .../others/cn/ComputeHammingHandlerTest.java | 21 ++++++++++++ .../others/cn/MockHammingHandler.java | 13 ++++++++ .../others/cn/ValidateBinaryHandlerTest.java | 23 +++++++++++++ .../others/cn/ValidateLengthHandlerTest.java | 23 +++++++++++++ 9 files changed, 139 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/thealgorithms/others/cn/ComputeHammingHandler.java create mode 100644 src/main/java/com/thealgorithms/others/cn/HammingHandler.java create mode 100644 src/main/java/com/thealgorithms/others/cn/ValidateBinaryHandler.java create mode 100644 src/main/java/com/thealgorithms/others/cn/ValidateLengthHandler.java create mode 100644 src/test/java/com/thealgorithms/others/cn/ComputeHammingHandlerTest.java create mode 100644 src/test/java/com/thealgorithms/others/cn/MockHammingHandler.java create mode 100644 src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java create mode 100644 src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java 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..0d0920ecb5e2 --- /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; + } +} \ No newline at end of file diff --git a/src/main/java/com/thealgorithms/others/cn/HammingDistance.java b/src/main/java/com/thealgorithms/others/cn/HammingDistance.java index c8239d53d606..1a501e303d6b 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."); - } - } + private HammingDistance() { + } - public static int compute(char charA, char charB) { - checkChar(charA); - checkChar(charB); - return charA == charB ? 0 : 1; - } + public static int compute(String bitsStrA, String bitsStrB) { + HammingHandler chain = new ValidateBinaryHandler(); + chain.setNext(new ValidateLengthHandler()).setNext(new ComputeHammingHandler()); - 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)); - } - - 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..4625f0452411 --- /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); +} \ No newline at end of file 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..055134208001 --- /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); + } +} \ No newline at end of file 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..36ae2dea0237 --- /dev/null +++ b/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java @@ -0,0 +1,23 @@ +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..4f24be67884c --- /dev/null +++ b/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java @@ -0,0 +1,23 @@ +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"); + } +} From 46dc663d7805ecee9a1c00ab38825f9a7ac0ae62 Mon Sep 17 00:00:00 2001 From: dinishajais Date: Sun, 27 Jul 2025 07:15:58 +0530 Subject: [PATCH 2/6] Added formatting --- A.java | 1 + .../java/com/thealgorithms/others/cn/ComputeHammingHandler.java | 2 +- src/main/java/com/thealgorithms/others/cn/HammingHandler.java | 2 +- .../java/com/thealgorithms/others/cn/ValidateBinaryHandler.java | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 A.java diff --git a/A.java b/A.java new file mode 100644 index 000000000000..8b4231a7dd31 --- /dev/null +++ b/A.java @@ -0,0 +1 @@ +git remote set-url upstream https://github.com/TheAlgorithms/Java.git diff --git a/src/main/java/com/thealgorithms/others/cn/ComputeHammingHandler.java b/src/main/java/com/thealgorithms/others/cn/ComputeHammingHandler.java index 0d0920ecb5e2..4f5f586557cf 100644 --- a/src/main/java/com/thealgorithms/others/cn/ComputeHammingHandler.java +++ b/src/main/java/com/thealgorithms/others/cn/ComputeHammingHandler.java @@ -9,4 +9,4 @@ public Object handle(String bitsStrA, String bitsStrB) { } return totalErrorBitCount; } -} \ No newline at end of file +} diff --git a/src/main/java/com/thealgorithms/others/cn/HammingHandler.java b/src/main/java/com/thealgorithms/others/cn/HammingHandler.java index 4625f0452411..9d1f833f9a59 100644 --- a/src/main/java/com/thealgorithms/others/cn/HammingHandler.java +++ b/src/main/java/com/thealgorithms/others/cn/HammingHandler.java @@ -8,4 +8,4 @@ public HammingHandler setNext(HammingHandler next) { } public abstract Object handle(String bitsStrA, String bitsStrB); -} \ No newline at end of file +} diff --git a/src/main/java/com/thealgorithms/others/cn/ValidateBinaryHandler.java b/src/main/java/com/thealgorithms/others/cn/ValidateBinaryHandler.java index 055134208001..d9d1884dff21 100644 --- a/src/main/java/com/thealgorithms/others/cn/ValidateBinaryHandler.java +++ b/src/main/java/com/thealgorithms/others/cn/ValidateBinaryHandler.java @@ -15,4 +15,4 @@ public Object handle(String bitsStrA, String bitsStrB) { checkBinary(bitsStrB); return next.handle(bitsStrA, bitsStrB); } -} \ No newline at end of file +} From bd10fa17da92227cf890c176ab248c6b39fd2b61 Mon Sep 17 00:00:00 2001 From: dinishajais Date: Sun, 27 Jul 2025 07:18:10 +0530 Subject: [PATCH 3/6] Deleting the unnecessary file added by mistake --- A.java | 1 - 1 file changed, 1 deletion(-) delete mode 100644 A.java diff --git a/A.java b/A.java deleted file mode 100644 index 8b4231a7dd31..000000000000 --- a/A.java +++ /dev/null @@ -1 +0,0 @@ -git remote set-url upstream https://github.com/TheAlgorithms/Java.git From 6ebd7044b7c526b35c0c6178177c2c8c464482c1 Mon Sep 17 00:00:00 2001 From: dinishajais Date: Sun, 27 Jul 2025 07:30:23 +0530 Subject: [PATCH 4/6] resolving build issue --- .../thealgorithms/others/cn/HammingDistance.java | 14 +++++++------- .../others/cn/ValidateBinaryHandlerTest.java | 2 +- .../others/cn/ValidateLengthHandlerTest.java | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/thealgorithms/others/cn/HammingDistance.java b/src/main/java/com/thealgorithms/others/cn/HammingDistance.java index 1a501e303d6b..eab0b45ac282 100644 --- a/src/main/java/com/thealgorithms/others/cn/HammingDistance.java +++ b/src/main/java/com/thealgorithms/others/cn/HammingDistance.java @@ -2,13 +2,13 @@ public final class HammingDistance { - private HammingDistance() { - } + private HammingDistance() { + } - public static int compute(String bitsStrA, String bitsStrB) { - HammingHandler chain = new ValidateBinaryHandler(); - chain.setNext(new ValidateLengthHandler()).setNext(new ComputeHammingHandler()); + public static int compute(String bitsStrA, String bitsStrB) { + HammingHandler chain = new ValidateBinaryHandler(); + chain.setNext(new ValidateLengthHandler()).setNext(new ComputeHammingHandler()); - return (int) chain.handle(bitsStrA, bitsStrB); - } + return (int) chain.handle(bitsStrA, bitsStrB); + } } diff --git a/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java b/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java index 36ae2dea0237..7024cdc4e0e5 100644 --- a/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java +++ b/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java @@ -9,7 +9,7 @@ public class ValidateBinaryHandlerTest { @Test public void validBinaryStringsShouldPass() { - handler.setNext(new MockHammingHandler("PASSED")); + handler.setNext(new MockHammingHandler("PASSED")); Object result = handler.handle("1010", "0110"); Assertions.assertThat(result).isEqualTo("PASSED"); } diff --git a/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java b/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java index 4f24be67884c..6524d7f0d5bd 100644 --- a/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java +++ b/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java @@ -9,7 +9,7 @@ public class ValidateLengthHandlerTest { @Test public void validLengthShouldPass() { - handler.setNext(new MockHammingHandler("LENGTH_OK")); + handler.setNext(new MockHammingHandler("LENGTH_OK")); Object result = handler.handle("1010", "0110"); Assertions.assertThat(result).isEqualTo("LENGTH_OK"); } From 0413a607e1c15b7fbb4d3c80bebfebe7412cc067 Mon Sep 17 00:00:00 2001 From: dinishajais Date: Sun, 27 Jul 2025 07:35:00 +0530 Subject: [PATCH 5/6] Reverting back the changes for it seems the formatter in build job is not giving correct issues --- .../thealgorithms/others/cn/HammingDistance.java | 14 +++++++------- .../others/cn/ValidateBinaryHandlerTest.java | 2 +- .../others/cn/ValidateLengthHandlerTest.java | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/thealgorithms/others/cn/HammingDistance.java b/src/main/java/com/thealgorithms/others/cn/HammingDistance.java index eab0b45ac282..1a501e303d6b 100644 --- a/src/main/java/com/thealgorithms/others/cn/HammingDistance.java +++ b/src/main/java/com/thealgorithms/others/cn/HammingDistance.java @@ -2,13 +2,13 @@ public final class HammingDistance { - private HammingDistance() { - } + private HammingDistance() { + } - public static int compute(String bitsStrA, String bitsStrB) { - HammingHandler chain = new ValidateBinaryHandler(); - chain.setNext(new ValidateLengthHandler()).setNext(new ComputeHammingHandler()); + public static int compute(String bitsStrA, String bitsStrB) { + HammingHandler chain = new ValidateBinaryHandler(); + chain.setNext(new ValidateLengthHandler()).setNext(new ComputeHammingHandler()); - return (int) chain.handle(bitsStrA, bitsStrB); - } + return (int) chain.handle(bitsStrA, bitsStrB); + } } diff --git a/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java b/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java index 7024cdc4e0e5..36ae2dea0237 100644 --- a/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java +++ b/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java @@ -9,7 +9,7 @@ public class ValidateBinaryHandlerTest { @Test public void validBinaryStringsShouldPass() { - handler.setNext(new MockHammingHandler("PASSED")); + handler.setNext(new MockHammingHandler("PASSED")); Object result = handler.handle("1010", "0110"); Assertions.assertThat(result).isEqualTo("PASSED"); } diff --git a/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java b/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java index 6524d7f0d5bd..4f24be67884c 100644 --- a/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java +++ b/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java @@ -9,7 +9,7 @@ public class ValidateLengthHandlerTest { @Test public void validLengthShouldPass() { - handler.setNext(new MockHammingHandler("LENGTH_OK")); + handler.setNext(new MockHammingHandler("LENGTH_OK")); Object result = handler.handle("1010", "0110"); Assertions.assertThat(result).isEqualTo("LENGTH_OK"); } From 086ca72496901afda75429b124349bdfdb44da4d Mon Sep 17 00:00:00 2001 From: dinishajais Date: Sun, 27 Jul 2025 21:47:45 +0530 Subject: [PATCH 6/6] Formatted acc to clang-format --- .../thealgorithms/others/cn/HammingDistance.java | 14 +++++++------- .../others/cn/ValidateBinaryHandlerTest.java | 6 ++---- .../others/cn/ValidateLengthHandlerTest.java | 6 ++---- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/thealgorithms/others/cn/HammingDistance.java b/src/main/java/com/thealgorithms/others/cn/HammingDistance.java index 1a501e303d6b..b5563563b49e 100644 --- a/src/main/java/com/thealgorithms/others/cn/HammingDistance.java +++ b/src/main/java/com/thealgorithms/others/cn/HammingDistance.java @@ -2,13 +2,13 @@ public final class HammingDistance { - private HammingDistance() { - } + private HammingDistance() { + } - public static int compute(String bitsStrA, String bitsStrB) { - HammingHandler chain = new ValidateBinaryHandler(); - chain.setNext(new ValidateLengthHandler()).setNext(new ComputeHammingHandler()); + public static int compute(String bitsStrA, String bitsStrB) { + HammingHandler chain = new ValidateBinaryHandler(); + chain.setNext(new ValidateLengthHandler()).setNext(new ComputeHammingHandler()); - return (int) chain.handle(bitsStrA, bitsStrB); - } + return (int) chain.handle(bitsStrA, bitsStrB); + } } diff --git a/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java b/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java index 36ae2dea0237..2837d1c8990d 100644 --- a/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java +++ b/src/test/java/com/thealgorithms/others/cn/ValidateBinaryHandlerTest.java @@ -9,15 +9,13 @@ public class ValidateBinaryHandlerTest { @Test public void validBinaryStringsShouldPass() { - handler.setNext(new MockHammingHandler("PASSED")); + 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"); + 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 index 4f24be67884c..45bf65c82dc5 100644 --- a/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java +++ b/src/test/java/com/thealgorithms/others/cn/ValidateLengthHandlerTest.java @@ -9,15 +9,13 @@ public class ValidateLengthHandlerTest { @Test public void validLengthShouldPass() { - handler.setNext(new MockHammingHandler("LENGTH_OK")); + 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"); + Assertions.assertThatThrownBy(() -> handler.handle("101", "10")).isInstanceOf(IllegalArgumentException.class).hasMessageContaining("same length"); } }