BAEL-5646: String permutation examples (#12595) · atcn-java/tutorials@444e46a · GitHub
Skip to content

Commit 444e46a

Browse files
authored
BAEL-5646: String permutation examples (eugenp#12595)
1 parent 4016756 commit 444e46a

8 files changed

Lines changed: 222 additions & 13 deletions

File tree

algorithms-modules/algorithms-miscellaneous-4/pom.xml

Lines changed: 27 additions & 13 deletions
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.baeldung.algorithms.stringpermutation;
2+
3+
import java.util.List;
4+
import java.util.stream.Collectors;
5+
6+
public class ArrayHelper {
7+
8+
private ArrayHelper() {
9+
}
10+
11+
static List<Character> toCharacterList(final String string) {
12+
return string.chars().mapToObj(s -> ((char) s)).collect(Collectors.toList());
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.baeldung.algorithms.stringpermutation;
2+
3+
import java.util.Collection;
4+
import java.util.List;
5+
import org.apache.commons.collections4.CollectionUtils;
6+
import org.apache.commons.collections4.iterators.PermutationIterator;
7+
8+
public class StringPermutationsApache {
9+
10+
public Collection<List<Character>> eagerPermutationWithRepetitions(final String string) {
11+
final List<Character> characters = ArrayHelper.toCharacterList(string);
12+
return CollectionUtils.permutations(characters);
13+
}
14+
15+
public PermutationIterator<Character> lazyPermutationWithoutRepetitions(final String string) {
16+
final List<Character> characters = ArrayHelper.toCharacterList(string);
17+
return new PermutationIterator<>(characters);
18+
}
19+
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.baeldung.algorithms.stringpermutation;
2+
3+
import java.util.List;
4+
import java.util.stream.Collectors;
5+
import org.paukov.combinatorics3.Generator;
6+
import org.paukov.combinatorics3.PermutationGenerator.TreatDuplicatesAs;
7+
8+
public class StringPermutationsCombinatoricsLib {
9+
10+
public List<List<Character>> permutationWithoutRepetitions(final String string) {
11+
List<Character> chars = ArrayHelper.toCharacterList(string);
12+
return Generator.permutation(chars)
13+
.simple()
14+
.stream()
15+
.collect(Collectors.toList());
16+
}
17+
18+
public List<List<Character>> permutationWithRepetitions(final String string) {
19+
List<Character> chars = ArrayHelper.toCharacterList(string);
20+
return Generator.permutation(chars)
21+
.simple(TreatDuplicatesAs.IDENTICAL)
22+
.stream()
23+
.collect(Collectors.toList());
24+
}
25+
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.baeldung.algorithms.stringpermutation;
2+
3+
import com.google.common.collect.Collections2;
4+
import java.util.Collection;
5+
import java.util.List;
6+
7+
public class StringPermutationsGuava {
8+
9+
public Collection<List<Character>> permutationWithRepetitions(final String string) {
10+
final List<Character> characters = ArrayHelper.toCharacterList(string);
11+
return Collections2.permutations(characters);
12+
}
13+
public Collection<List<Character>> permutationWithoutRepetitions(final String string) {
14+
final List<Character> characters = ArrayHelper.toCharacterList(string);
15+
return Collections2.orderedPermutations(characters);
16+
}
17+
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.baeldung.algorithms.stringpermutation;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.util.Collection;
6+
import java.util.List;
7+
import org.apache.commons.collections4.iterators.PermutationIterator;
8+
import org.junit.jupiter.api.DisplayName;
9+
import org.junit.jupiter.params.ParameterizedTest;
10+
import org.junit.jupiter.params.provider.CsvSource;
11+
12+
class StringPermutationsApacheUnitTest {
13+
14+
@CsvSource({"abc, 6",
15+
"hello, 120",
16+
"aaaaaa, 720"})
17+
@DisplayName("Apache permutation for ")
18+
void testPermutationsWithRepetitions(String string, int numberOfPermutations) {
19+
StringPermutationsApache permutationGenerator = new StringPermutationsApache();
20+
final Collection<List<Character>> permutations = permutationGenerator.eagerPermutationWithRepetitions(string);
21+
final int size = permutations.size();
22+
assertThat(permutations)
23+
.as("\"%s\" should have %d permutation, but had %d", string, numberOfPermutations, size)
24+
.hasSize(numberOfPermutations);
25+
}
26+
27+
@ParameterizedTest
28+
@CsvSource({"abc, 6",
29+
"hello, 120",
30+
"aaaaaa, 720"})
31+
void testPermutationsWithoutRepetitions(String string, int numberOfPermutations) {
32+
StringPermutationsApache permutationGenerator = new StringPermutationsApache();
33+
final PermutationIterator<Character> permutations = permutationGenerator.lazyPermutationWithoutRepetitions(string);
34+
int size = 0;
35+
while (permutations.hasNext()) {
36+
permutations.next();
37+
++size;
38+
}
39+
assertThat(size)
40+
.as("\"%s\" should have %d permutation, but had %d", string, numberOfPermutations, size)
41+
.isEqualTo(numberOfPermutations);
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.baeldung.algorithms.stringpermutation;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.util.List;
6+
import org.junit.jupiter.params.ParameterizedTest;
7+
import org.junit.jupiter.params.provider.CsvSource;
8+
9+
class StringPermutationsCombinatoricsLibUnitTest {
10+
11+
@ParameterizedTest
12+
@CsvSource({"abc, 6",
13+
"hello, 120",
14+
"aaaaaa, 720"})
15+
void testPermutationsWithRepetitions(String string, int numberOfPermutations) {
16+
StringPermutationsCombinatoricsLib permutationGenerator = new StringPermutationsCombinatoricsLib();
17+
final List<List<Character>> permutations = permutationGenerator.permutationWithRepetitions(string);
18+
final int size = permutations.size();
19+
assertThat(permutations)
20+
.as("\"%s\" should have %d permutation, but had %d", string, numberOfPermutations, size)
21+
.hasSize(numberOfPermutations);
22+
}
23+
24+
@ParameterizedTest
25+
@CsvSource({"abc, 6",
26+
"hello, 60",
27+
"aaaaaa, 1"})
28+
void testPermutationsWithoutRepetitions(String string, int numberOfPermutations) {
29+
StringPermutationsCombinatoricsLib permutationGenerator = new StringPermutationsCombinatoricsLib();
30+
final List<List<Character>> permutations = permutationGenerator.permutationWithoutRepetitions(string);
31+
final int size = permutations.size();
32+
assertThat(permutations)
33+
.as("\"%s\" should have %d permutation, but had %d", string, numberOfPermutations, size)
34+
.hasSize(numberOfPermutations);
35+
}
36+
}

0 commit comments

Comments
 (0)