From e983f3572b7d69da8896d69d6d00fe3cf83f6d31 Mon Sep 17 00:00:00 2001 From: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Date: Sun, 14 Aug 2022 20:35:52 +0200 Subject: [PATCH] BAEL-5646: String permutation examples (#12595) --- .../algorithms-miscellaneous-4/pom.xml | 40 +++++++++++------ .../stringpermutation/ArrayHelper.java | 14 ++++++ .../StringPermutationsApache.java | 20 +++++++++ .../StringPermutationsCombinatoricsLib.java | 26 +++++++++++ .../StringPermutationsGuava.java | 18 ++++++++ .../StringPermutationsApacheUnitTest.java | 43 +++++++++++++++++++ ...gPermutationsCombinatoricsLibUnitTest.java | 36 ++++++++++++++++ .../StringPermutationsGuavaUnitTest.java | 38 ++++++++++++++++ 8 files changed, 222 insertions(+), 13 deletions(-) create mode 100644 algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/ArrayHelper.java create mode 100644 algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsApache.java create mode 100644 algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsCombinatoricsLib.java create mode 100644 algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsGuava.java create mode 100644 algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsApacheUnitTest.java create mode 100644 algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsCombinatoricsLibUnitTest.java create mode 100644 algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsGuavaUnitTest.java diff --git a/algorithms-modules/algorithms-miscellaneous-4/pom.xml b/algorithms-modules/algorithms-miscellaneous-4/pom.xml index ed752a6b41..0e0841b72e 100644 --- a/algorithms-modules/algorithms-miscellaneous-4/pom.xml +++ b/algorithms-modules/algorithms-miscellaneous-4/pom.xml @@ -13,18 +13,32 @@ 1.0.0-SNAPSHOT - - - com.google.guava - guava - ${guava.version} - - - org.projectlombok - lombok - ${lombok.version} - provided - - + + 3.3.3 + 4.4 + + + + com.google.guava + guava + ${guava.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + com.github.dpaukov + combinatoricslib3 + ${combinatoricslib3.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + \ No newline at end of file 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/ArrayHelper.java new file mode 100644 index 0000000000..6b4f1fcb12 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/ArrayHelper.java @@ -0,0 +1,14 @@ +package com.baeldung.algorithms.stringpermutation; + +import java.util.List; +import java.util.stream.Collectors; + +public class ArrayHelper { + + private ArrayHelper() { + } + + static List toCharacterList(final String string) { + return string.chars().mapToObj(s -> ((char) s)).collect(Collectors.toList()); + } +} 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 new file mode 100644 index 0000000000..c2522a6ec5 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsApache.java @@ -0,0 +1,20 @@ +package com.baeldung.algorithms.stringpermutation; + +import java.util.Collection; +import java.util.List; +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 PermutationIterator lazyPermutationWithoutRepetitions(final String string) { + final List characters = ArrayHelper.toCharacterList(string); + return new PermutationIterator<>(characters); + } + +} 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 new file mode 100644 index 0000000000..78182f8045 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsCombinatoricsLib.java @@ -0,0 +1,26 @@ +package com.baeldung.algorithms.stringpermutation; + +import java.util.List; +import java.util.stream.Collectors; +import org.paukov.combinatorics3.Generator; +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> permutationWithRepetitions(final String string) { + List chars = ArrayHelper.toCharacterList(string); + return Generator.permutation(chars) + .simple(TreatDuplicatesAs.IDENTICAL) + .stream() + .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 new file mode 100644 index 0000000000..d055381bf1 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/stringpermutation/StringPermutationsGuava.java @@ -0,0 +1,18 @@ +package com.baeldung.algorithms.stringpermutation; + +import com.google.common.collect.Collections2; +import java.util.Collection; +import java.util.List; + +public class StringPermutationsGuava { + + public Collection> permutationWithRepetitions(final String string) { + final List characters = ArrayHelper.toCharacterList(string); + return Collections2.permutations(characters); + } +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/StringPermutationsApacheUnitTest.java b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsApacheUnitTest.java new file mode 100644 index 0000000000..d0deb85887 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsApacheUnitTest.java @@ -0,0 +1,43 @@ +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 { + + @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 int size = permutations.size(); + assertThat(permutations) + .as("\"%s\" should have %d permutation, but had %d", string, numberOfPermutations, size) + .hasSize(numberOfPermutations); + } + + @ParameterizedTest + @CsvSource({"abc, 6", + "hello, 120", + "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; + } + assertThat(size) + .as("\"%s\" should have %d permutation, but had %d", string, numberOfPermutations, size) + .isEqualTo(numberOfPermutations); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000000..faca3d8f30 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsCombinatoricsLibUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.algorithms.stringpermutation; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class StringPermutationsCombinatoricsLibUnitTest { + + @ParameterizedTest + @CsvSource({"abc, 6", + "hello, 120", + "aaaaaa, 720"}) + void testPermutationsWithRepetitions(String string, int numberOfPermutations) { + StringPermutationsCombinatoricsLib permutationGenerator = new StringPermutationsCombinatoricsLib(); + 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) + .hasSize(numberOfPermutations); + } + + @ParameterizedTest + @CsvSource({"abc, 6", + "hello, 60", + "aaaaaa, 1"}) + void testPermutationsWithoutRepetitions(String string, int numberOfPermutations) { + StringPermutationsCombinatoricsLib permutationGenerator = new StringPermutationsCombinatoricsLib(); + 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) + .hasSize(numberOfPermutations); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000000..d2da100997 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/stringpermutation/StringPermutationsGuavaUnitTest.java @@ -0,0 +1,38 @@ +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; + +class StringPermutationsGuavaUnitTest { + + @ParameterizedTest + @CsvSource({"abc, 6", + "hello, 120", + "aaaaaa, 720"}) + void testPermutationsWithRepetitions(String string, int numberOfPermutations) { + StringPermutationsGuava permutationGenerator = new StringPermutationsGuava(); + final Collection> permutations = permutationGenerator.permutationWithRepetitions(string); + final int size = permutations.size(); + assertThat(permutations) + .as("\"%s\" should have %d permutation, but had %d", string, numberOfPermutations, size) + .hasSize(numberOfPermutations); + } + + @ParameterizedTest + @CsvSource({"abc, 6", + "hello, 60", + "aaaaaa, 1"}) + void testPermutationsWithoutRepetitions(String string, int numberOfPermutations) { + StringPermutationsGuava permutationGenerator = new StringPermutationsGuava(); + final Collection> permutations = permutationGenerator.permutationWithoutRepetitions(string); + final int size = permutations.size(); + assertThat(permutations) + .as("\"%s\" should have %d permutation, but had %d", string, numberOfPermutations, size) + .hasSize(numberOfPermutations); + } + +} \ No newline at end of file