Skip to content

Commit d5423f5

Browse files
committed
Improvement of Hamming Distance class
1 parent 066a109 commit d5423f5

File tree

9 files changed

+139
-25
lines changed

9 files changed

+139
-25
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.thealgorithms.others.cn;
2+
public class ComputeHammingHandler extends HammingHandler {
3+
4+
@Override
5+
public Object handle(String bitsStrA, String bitsStrB) {
6+
int totalErrorBitCount = 0;
7+
for (int i = 0; i < bitsStrA.length(); i++) {
8+
totalErrorBitCount += bitsStrA.charAt(i) == bitsStrB.charAt(i) ? 0 : 1;
9+
}
10+
return totalErrorBitCount;
11+
}
12+
}
Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,14 @@
11
package com.thealgorithms.others.cn;
22

33
public final class HammingDistance {
4-
private HammingDistance() {
5-
}
64

7-
private static void checkChar(char inChar) {
8-
if (inChar != '0' && inChar != '1') {
9-
throw new IllegalArgumentException("Input must be a binary string.");
10-
}
11-
}
5+
private HammingDistance() {
6+
}
127

13-
public static int compute(char charA, char charB) {
14-
checkChar(charA);
15-
checkChar(charB);
16-
return charA == charB ? 0 : 1;
17-
}
8+
public static int compute(String bitsStrA, String bitsStrB) {
9+
HammingHandler chain = new ValidateBinaryHandler();
10+
chain.setNext(new ValidateLengthHandler()).setNext(new ComputeHammingHandler());
1811

19-
public static int compute(String bitsStrA, String bitsStrB) {
20-
if (bitsStrA.length() != bitsStrB.length()) {
21-
throw new IllegalArgumentException("Input strings must have the same length.");
22-
}
23-
24-
int totalErrorBitCount = 0;
25-
26-
for (int i = 0; i < bitsStrA.length(); i++) {
27-
totalErrorBitCount += compute(bitsStrA.charAt(i), bitsStrB.charAt(i));
28-
}
29-
30-
return totalErrorBitCount;
31-
}
12+
return (int) chain.handle(bitsStrA, bitsStrB);
13+
}
3214
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.thealgorithms.others.cn;
2+
public abstract class HammingHandler {
3+
protected HammingHandler next;
4+
5+
public HammingHandler setNext(HammingHandler next) {
6+
this.next = next;
7+
return next;
8+
}
9+
10+
public abstract Object handle(String bitsStrA, String bitsStrB);
11+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.thealgorithms.others.cn;
2+
public class ValidateBinaryHandler extends HammingHandler {
3+
4+
private void checkBinary(String str) {
5+
for (char c : str.toCharArray()) {
6+
if (c != '0' && c != '1') {
7+
throw new IllegalArgumentException("Input must be a binary string.");
8+
}
9+
}
10+
}
11+
12+
@Override
13+
public Object handle(String bitsStrA, String bitsStrB) {
14+
checkBinary(bitsStrA);
15+
checkBinary(bitsStrB);
16+
return next.handle(bitsStrA, bitsStrB);
17+
}
18+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.thealgorithms.others.cn;
2+
public class ValidateLengthHandler extends HammingHandler {
3+
4+
@Override
5+
public Object handle(String bitsStrA, String bitsStrB) {
6+
if (bitsStrA.length() != bitsStrB.length()) {
7+
throw new IllegalArgumentException("Input strings must have the same length.");
8+
}
9+
return next.handle(bitsStrA, bitsStrB);
10+
}
11+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.thealgorithms.others.cn;
2+
3+
import org.assertj.core.api.Assertions;
4+
import org.junit.jupiter.api.Test;
5+
6+
public class ComputeHammingHandlerTest {
7+
8+
private final ComputeHammingHandler handler = new ComputeHammingHandler();
9+
10+
@Test
11+
public void testHammingDistanceComputation() {
12+
Object result = handler.handle("1101", "1001");
13+
Assertions.assertThat(result).isEqualTo(1);
14+
}
15+
16+
@Test
17+
public void identicalStringsShouldReturnZero() {
18+
Object result = handler.handle("1111", "1111");
19+
Assertions.assertThat(result).isEqualTo(0);
20+
}
21+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.thealgorithms.others.cn;
2+
public class MockHammingHandler extends HammingHandler {
3+
private final Object returnValue;
4+
5+
public MockHammingHandler(Object returnValue) {
6+
this.returnValue = returnValue;
7+
}
8+
9+
@Override
10+
public Object handle(String a, String b) {
11+
return returnValue;
12+
}
13+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.thealgorithms.others.cn;
2+
3+
import org.assertj.core.api.Assertions;
4+
import org.junit.jupiter.api.Test;
5+
6+
public class ValidateBinaryHandlerTest {
7+
8+
private final ValidateBinaryHandler handler = new ValidateBinaryHandler();
9+
10+
@Test
11+
public void validBinaryStringsShouldPass() {
12+
handler.setNext(new MockHammingHandler("PASSED"));
13+
Object result = handler.handle("1010", "0110");
14+
Assertions.assertThat(result).isEqualTo("PASSED");
15+
}
16+
17+
@Test
18+
public void invalidBinaryShouldThrowException() {
19+
Assertions.assertThatThrownBy(() -> handler.handle("10A0", "0110"))
20+
.isInstanceOf(IllegalArgumentException.class)
21+
.hasMessageContaining("binary string");
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.thealgorithms.others.cn;
2+
3+
import org.assertj.core.api.Assertions;
4+
import org.junit.jupiter.api.Test;
5+
6+
public class ValidateLengthHandlerTest {
7+
8+
private final ValidateLengthHandler handler = new ValidateLengthHandler();
9+
10+
@Test
11+
public void validLengthShouldPass() {
12+
handler.setNext(new MockHammingHandler("LENGTH_OK"));
13+
Object result = handler.handle("1010", "0110");
14+
Assertions.assertThat(result).isEqualTo("LENGTH_OK");
15+
}
16+
17+
@Test
18+
public void mismatchedLengthShouldThrowException() {
19+
Assertions.assertThatThrownBy(() -> handler.handle("101", "10"))
20+
.isInstanceOf(IllegalArgumentException.class)
21+
.hasMessageContaining("same length");
22+
}
23+
}

0 commit comments

Comments
 (0)