diff --git a/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/ArrayHelper.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/Helper.java similarity index 54% rename from algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/ArrayHelper.java rename to algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/Helper.java index 6b4f1fcb12..8d769b16af 100644 --- a/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/ArrayHelper.java +++ b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/Helper.java @@ -1,14 +1,20 @@ package com.baeldung.algorithms.stringpermutation; +import java.util.Collection; import java.util.List; import java.util.stream.Collectors; -public class ArrayHelper { +public class Helper { - private ArrayHelper() { + private Helper() { } static List toCharacterList(final String string) { return string.chars().mapToObj(s -> ((char) s)).collect(Collectors.toList()); } + + static String toString(Collection collection) { + return collection.stream().map(Object::toString).collect(Collectors.joining()); + } + } diff --git a/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsApache.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsApache.java index c2522a6ec5..97abca64cd 100644 --- a/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsApache.java +++ b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsApache.java @@ -1,20 +1,29 @@ package com.baeldung.algorithms.stringpermutation; -import java.util.Collection; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.iterators.PermutationIterator; public class StringPermutationsApache { - public Collection> eagerPermutationWithRepetitions(final String string) { - final List characters = ArrayHelper.toCharacterList(string); - return CollectionUtils.permutations(characters); + public List eagerPermutationWithRepetitions(final String string) { + final List characters = Helper.toCharacterList(string); + return CollectionUtils.permutations(characters) + .stream() + .map(Helper::toString) + .collect(Collectors.toList()); } - public PermutationIterator lazyPermutationWithoutRepetitions(final String string) { - final List characters = ArrayHelper.toCharacterList(string); - return new PermutationIterator<>(characters); + public List lazyPermutationWithoutRepetitions(final String string) { + final List characters = Helper.toCharacterList(string); + final PermutationIterator permutationIterator = new PermutationIterator<>(characters); + final List result = new ArrayList<>(); + while (permutationIterator.hasNext()) { + result.add(Helper.toString(permutationIterator.next())); + } + return result; } } diff --git a/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsCombinatoricsLib.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsCombinatoricsLib.java index 78182f8045..45e4aae1fb 100644 --- a/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsCombinatoricsLib.java +++ b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsCombinatoricsLib.java @@ -7,19 +7,21 @@ import org.paukov.combinatorics3.PermutationGenerator.TreatDuplicatesAs; public class StringPermutationsCombinatoricsLib { - public List> permutationWithoutRepetitions(final String string) { - List chars = ArrayHelper.toCharacterList(string); - return Generator.permutation(chars) - .simple() - .stream() - .collect(Collectors.toList()); - } +public List permutationWithoutRepetitions(final String string) { + List chars = Helper.toCharacterList(string); + return Generator.permutation(chars) + .simple() + .stream() + .map(Helper::toString) + .collect(Collectors.toList()); +} - public List> permutationWithRepetitions(final String string) { - List chars = ArrayHelper.toCharacterList(string); + public List permutationWithRepetitions(final String string) { + List chars = Helper.toCharacterList(string); return Generator.permutation(chars) .simple(TreatDuplicatesAs.IDENTICAL) .stream() + .map(Helper::toString) .collect(Collectors.toList()); } diff --git a/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsGuava.java b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsGuava.java index d055381bf1..07ac1a2abf 100644 --- a/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsGuava.java +++ b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsGuava.java @@ -1,18 +1,22 @@ package com.baeldung.algorithms.stringpermutation; import com.google.common.collect.Collections2; -import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; public class StringPermutationsGuava { - public Collection> permutationWithRepetitions(final String string) { - final List characters = ArrayHelper.toCharacterList(string); - return Collections2.permutations(characters); + public List permutationWithRepetitions(final String string) { + final List characters = Helper.toCharacterList(string); + return Collections2.permutations(characters).stream() + .map(Helper::toString) + .collect(Collectors.toList()); + } + public List permutationWithoutRepetitions(final String string) { + final List characters = Helper.toCharacterList(string); + return Collections2.orderedPermutations(characters).stream() + .map(Helper::toString) + .collect(Collectors.toList()); } -public Collection> permutationWithoutRepetitions(final String string) { - final List characters = ArrayHelper.toCharacterList(string); - return Collections2.orderedPermutations(characters); -} } diff --git a/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/HelperUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/HelperUnitTest.java new file mode 100644 index 0000000000..450713fac4 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/HelperUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.algorithms.stringpermutation; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class HelperUnitTest { + + @ParameterizedTest + @MethodSource("stringProvider") + void toListTest(String value, List expected) { + final List actual = Helper.toCharacterList(value); + assertThat(expected).isEqualTo(actual); + } + + @ParameterizedTest + @MethodSource("stringProvider") + void toStringTest(String expected, List value) { + final String actual = Helper.toString(value); + assertThat(expected).isEqualTo(actual); + } + + static Stream stringProvider() { + return Stream.of( + Arguments.of("hello", Arrays.asList('h', 'e', 'l', 'l', 'o')), + Arguments.of("abc", Arrays.asList('a','b','c')), + Arguments.of("12345", Arrays.asList('1', '2', '3', '4', '5')) + ); + } + +} \ No newline at end of file diff --git a/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsApacheUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsApacheUnitTest.java index d0deb85887..9686287721 100644 --- a/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsApacheUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsApacheUnitTest.java @@ -2,22 +2,19 @@ package com.baeldung.algorithms.stringpermutation; import static org.assertj.core.api.Assertions.assertThat; -import java.util.Collection; import java.util.List; -import org.apache.commons.collections4.iterators.PermutationIterator; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; class StringPermutationsApacheUnitTest { + @ParameterizedTest @CsvSource({"abc, 6", "hello, 120", "aaaaaa, 720"}) - @DisplayName("Apache permutation for ") void testPermutationsWithRepetitions(String string, int numberOfPermutations) { StringPermutationsApache permutationGenerator = new StringPermutationsApache(); - final Collection> permutations = permutationGenerator.eagerPermutationWithRepetitions(string); + final List permutations = permutationGenerator.eagerPermutationWithRepetitions(string); final int size = permutations.size(); assertThat(permutations) .as("\"%s\" should have %d permutation, but had %d", string, numberOfPermutations, size) @@ -30,12 +27,8 @@ class StringPermutationsApacheUnitTest { "aaaaaa, 720"}) void testPermutationsWithoutRepetitions(String string, int numberOfPermutations) { StringPermutationsApache permutationGenerator = new StringPermutationsApache(); - final PermutationIterator permutations = permutationGenerator.lazyPermutationWithoutRepetitions(string); - int size = 0; - while (permutations.hasNext()) { - permutations.next(); - ++size; - } + final List permutations = permutationGenerator.lazyPermutationWithoutRepetitions(string); + int size = permutations.size(); assertThat(size) .as("\"%s\" should have %d permutation, but had %d", string, numberOfPermutations, size) .isEqualTo(numberOfPermutations); diff --git a/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsCombinatoricsLibUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsCombinatoricsLibUnitTest.java index faca3d8f30..8911ef559c 100644 --- a/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsCombinatoricsLibUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsCombinatoricsLibUnitTest.java @@ -14,7 +14,7 @@ class StringPermutationsCombinatoricsLibUnitTest { "aaaaaa, 720"}) void testPermutationsWithRepetitions(String string, int numberOfPermutations) { StringPermutationsCombinatoricsLib permutationGenerator = new StringPermutationsCombinatoricsLib(); - final List> permutations = permutationGenerator.permutationWithRepetitions(string); + final List permutations = permutationGenerator.permutationWithRepetitions(string); final int size = permutations.size(); assertThat(permutations) .as("\"%s\" should have %d permutation, but had %d", string, numberOfPermutations, size) @@ -27,7 +27,7 @@ class StringPermutationsCombinatoricsLibUnitTest { "aaaaaa, 1"}) void testPermutationsWithoutRepetitions(String string, int numberOfPermutations) { StringPermutationsCombinatoricsLib permutationGenerator = new StringPermutationsCombinatoricsLib(); - final List> permutations = permutationGenerator.permutationWithoutRepetitions(string); + final List permutations = permutationGenerator.permutationWithoutRepetitions(string); final int size = permutations.size(); assertThat(permutations) .as("\"%s\" should have %d permutation, but had %d", string, numberOfPermutations, size) diff --git a/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsGuavaUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsGuavaUnitTest.java index d2da100997..31c3ce8d12 100644 --- a/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsGuavaUnitTest.java +++ b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsGuavaUnitTest.java @@ -2,7 +2,6 @@ package com.baeldung.algorithms.stringpermutation; import static org.assertj.core.api.Assertions.assertThat; -import java.util.Collection; import java.util.List; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -15,7 +14,7 @@ class StringPermutationsGuavaUnitTest { "aaaaaa, 720"}) void testPermutationsWithRepetitions(String string, int numberOfPermutations) { StringPermutationsGuava permutationGenerator = new StringPermutationsGuava(); - final Collection> permutations = permutationGenerator.permutationWithRepetitions(string); + final List permutations = permutationGenerator.permutationWithRepetitions(string); final int size = permutations.size(); assertThat(permutations) .as("\"%s\" should have %d permutation, but had %d", string, numberOfPermutations, size) @@ -28,7 +27,7 @@ class StringPermutationsGuavaUnitTest { "aaaaaa, 1"}) void testPermutationsWithoutRepetitions(String string, int numberOfPermutations) { StringPermutationsGuava permutationGenerator = new StringPermutationsGuava(); - final Collection> permutations = permutationGenerator.permutationWithoutRepetitions(string); + final List permutations = permutationGenerator.permutationWithoutRepetitions(string); final int size = permutations.size(); assertThat(permutations) .as("\"%s\" should have %d permutation, but had %d", string, numberOfPermutations, size)