___ _ _ _ _ __ _ _ _____
/ __\___ _ __ ___ | |__ (_)_ __ __ _| |_ ___ _ __(_) ___ ___ / /(_) |__ |___ /
/ / / _ \| '_ ` _ \| '_ \| | '_ \ / _` | __/ _ \| '__| |/ __/ __| / / | | '_ \ |_ \
/ /__| (_) | | | | | | |_) | | | | | (_| | || (_) | | | | (__\__ \/ /__| | |_) | ___) |
\____/\___/|_| |_| |_|_.__/|_|_| |_|\__,_|\__\___/|_| |_|\___|___/\____/_|_.__/ |____/
New version of the combinatorics library for Java 8. The previous version of the library can be found here
###1. Simple combinations A simple k-combination of a finite set S is a subset of k distinct elements of S. Specifying a subset does not arrange them in a particular order. As an example, a poker hand can be described as a 5-combination of cards from a 52-card deck: the 5 cards of the hand are all distinct, and the order of the cards in the hand does not matter.
Let's generate all 3-combination of the set of 5 colors (red, black, white, green, blue).
List<List<String>> combinations = Generator.combination("red", "black", "white", "green", "blue")
.simple(3)
.stream()
.collect(Collectors.<List<String>>toList());
combinations.stream().forEach(System.out::println);
And the result of 10 combinations
[red, black, white]
[red, black, green]
[red, black, blue]
[red, white, green]
[red, white, blue]
[red, green, blue]
[black, white, green]
[black, white, blue]
[black, green, blue]
[white, green, blue]
###2. Combinations with repetitions A k-multicombination or k-combination with repetition of a finite set S is given by a sequence of k not necessarily distinct elements of S, where order is not taken into account.
As an example. Suppose there are 2 types of fruits (apple and orange) at a grocery store, and you want to buy 3 pieces of fruit. You could select
- (apple, apple, apple)
- (apple, apple, orange)
- (apple, orange, orange)
- (orange, orange, orange)
Example. Generate 3-combinations with repetitions of the set (apple, orange). You can pass an array as the parameter in the function.
Generator.combination(new String[] { "apple", "orange" })
.multi(3)
.stream()
.forEach(System.out::println);
And the result of 4 multi-combinations
[apple, apple, apple]
[apple, apple, orange]
[apple, orange, orange]
[orange, orange, orange]
###3. Simple permutations A permutation is an ordering of a set in the context of all possible orderings. For example, the set containing the first three digits, 123, has six permutations: 123, 132, 213, 231, 312, and 321.
This is an example of the permutations of the 3 string items (apple, orange, cherry):
Generator.permutation("apple", "orange", "cherry")
.simple()
.stream()
.forEach(System.out::println);
The result of 6 permutations
[apple, orange, cherry]
[apple, cherry, orange]
[cherry, apple, orange]
[cherry, orange, apple]
[orange, cherry, apple]
[orange, apple, cherry]
This generator can produce the permutations even if an initial vector has duplicates. For example, all permutations of (1, 1, 2, 2):
Generator.permutation(1, 1, 2, 2)
.simple()
.stream()
.forEach(System.out::println);
The result of all possible permutations (with duplicates)
[1, 1, 2, 2]
[1, 2, 1, 2]
[1, 2, 2, 1]
[2, 1, 1, 2]
[2, 1, 2, 1]
[2, 2, 1, 1]
###4. Permutations with repetitions Permutation may have more elements than slots. For example, all possible permutation of '12' in three slots are: 111, 211, 121, 221, 112, 212, 122, and 222.
Let's generate all possible permutations with repetitions of 3 elements from the set of apple and orange.
List<List<String>> permutations = Generator
.permutation("apple", "orange")
.withRepetitions(3)
.stream()
.collect(Collectors.<List<String>>toList());
permutations.stream().forEach(System.out::println);
And the result of 8 permutations
[apple, apple, apple]
[orange, apple, apple]
[apple, orange, apple]
[orange, orange, apple]
[apple, apple, orange]
[orange, apple, orange]
[apple, orange, orange]
[orange, orange, orange]