refactor: unified duplicate Anagram classes into a single implementation (#6290)

This commit is contained in:
Deniz Altunkapan
2025-06-11 19:04:06 +02:00
committed by GitHub
parent 0b21bb0a38
commit 1745d19f09
9 changed files with 38 additions and 212 deletions

View File

@@ -13,36 +13,37 @@ public class AnagramsTest {
private static Stream<AnagramTestCase> anagramTestData() {
return Stream.of(new AnagramTestCase("late", "tale", true), new AnagramTestCase("late", "teal", true), new AnagramTestCase("listen", "silent", true), new AnagramTestCase("hello", "olelh", true), new AnagramTestCase("hello", "world", false), new AnagramTestCase("deal", "lead", true),
new AnagramTestCase("binary", "brainy", true), new AnagramTestCase("adobe", "abode", true), new AnagramTestCase("cat", "act", true), new AnagramTestCase("cat", "cut", false));
new AnagramTestCase("binary", "brainy", true), new AnagramTestCase("adobe", "abode", true), new AnagramTestCase("cat", "act", true), new AnagramTestCase("cat", "cut", false), new AnagramTestCase("Listen", "Silent", true), new AnagramTestCase("Dormitory", "DirtyRoom", true),
new AnagramTestCase("Schoolmaster", "TheClassroom", true), new AnagramTestCase("Astronomer", "MoonStarer", true), new AnagramTestCase("Conversation", "VoicesRantOn", true));
}
@ParameterizedTest
@MethodSource("anagramTestData")
void testApproach1(AnagramTestCase testCase) {
assertEquals(testCase.expected(), Anagrams.approach1(testCase.input1(), testCase.input2()));
assertEquals(testCase.expected(), Anagrams.areAnagramsBySorting(testCase.input1(), testCase.input2()));
}
@ParameterizedTest
@MethodSource("anagramTestData")
void testApproach2(AnagramTestCase testCase) {
assertEquals(testCase.expected(), Anagrams.approach2(testCase.input1(), testCase.input2()));
assertEquals(testCase.expected(), Anagrams.areAnagramsByCountingChars(testCase.input1(), testCase.input2()));
}
@ParameterizedTest
@MethodSource("anagramTestData")
void testApproach3(AnagramTestCase testCase) {
assertEquals(testCase.expected(), Anagrams.approach3(testCase.input1(), testCase.input2()));
assertEquals(testCase.expected(), Anagrams.areAnagramsByCountingCharsSingleArray(testCase.input1(), testCase.input2()));
}
@ParameterizedTest
@MethodSource("anagramTestData")
void testApproach4(AnagramTestCase testCase) {
assertEquals(testCase.expected(), Anagrams.approach4(testCase.input1(), testCase.input2()));
assertEquals(testCase.expected(), Anagrams.areAnagramsUsingHashMap(testCase.input1(), testCase.input2()));
}
@ParameterizedTest
@MethodSource("anagramTestData")
void testApproach5(AnagramTestCase testCase) {
assertEquals(testCase.expected(), Anagrams.approach5(testCase.input1(), testCase.input2()));
assertEquals(testCase.expected(), Anagrams.areAnagramsBySingleFreqArray(testCase.input1(), testCase.input2()));
}
}

View File

@@ -1,69 +0,0 @@
package com.thealgorithms.strings;
import static org.junit.jupiter.api.Assertions.assertThrows;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class CheckAnagramsTest {
private static final String MESSAGE = "Strings must contain only lowercase English letters!";
// CHECK METHOD isAnagrams()
@Test
public void testCheckAnagrams() {
String testString1 = "STUDY";
String testString2 = "DUSTY";
Assertions.assertTrue(CheckAnagrams.isAnagrams(testString1, testString2));
}
@Test
public void testCheckFalseAnagrams() {
String testString1 = "STUDY";
String testString2 = "random";
Assertions.assertFalse(CheckAnagrams.isAnagrams(testString1, testString2));
}
@Test
public void testCheckSameWordAnagrams() {
String testString1 = "STUDY";
Assertions.assertTrue(CheckAnagrams.isAnagrams(testString1, testString1));
}
@Test
public void testCheckDifferentCasesAnagram() {
String testString1 = "STUDY";
String testString2 = "dusty";
Assertions.assertTrue(CheckAnagrams.isAnagrams(testString1, testString2));
}
// CHECK METHOD isAnagramsUnicode()
// Below tests work with strings which consist of Unicode symbols & the algorithm is case-sensitive.
@Test
public void testStringAreValidAnagramsCaseSensitive() {
Assertions.assertTrue(CheckAnagrams.isAnagramsUnicode("Silent", "liSten"));
Assertions.assertTrue(CheckAnagrams.isAnagramsUnicode("This is a string", "is This a string"));
}
@Test
public void testStringAreNotAnagramsCaseSensitive() {
Assertions.assertFalse(CheckAnagrams.isAnagramsUnicode("Silent", "Listen"));
Assertions.assertFalse(CheckAnagrams.isAnagramsUnicode("This is a string", "Is this a string"));
}
// CHECK METHOD isAnagramsOptimised()
// Below tests work with strings which consist of only lowercase English letters
@Test
public void testOptimisedAlgorithmStringsAreValidAnagrams() {
Assertions.assertTrue(CheckAnagrams.isAnagramsOptimised("silent", "listen"));
Assertions.assertTrue(CheckAnagrams.isAnagramsOptimised("mam", "amm"));
}
@Test
public void testOptimisedAlgorithmShouldThrowExceptionWhenStringsContainUppercaseLetters() {
IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> CheckAnagrams.isAnagramsOptimised("Silent", "Listen"));
Assertions.assertEquals(exception.getMessage(), MESSAGE);
exception = assertThrows(IllegalArgumentException.class, () -> Assertions.assertFalse(CheckAnagrams.isAnagramsOptimised("This is a string", "Is this a string")));
Assertions.assertEquals(exception.getMessage(), MESSAGE);
}
}