@DonStefano: Dzięki, stworzyłem takiego potworka sugerując się Twoja odpowiedzią:
package pl.variants;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class AllVariants {
private static final List<List<Option>> allVariants = new ArrayList<>();
public static void main(String[] args) {
allVariants.add(repeat(new ArrayList<>()));
System.out.println(allVariants);
}
private static List<Option> repeat(List<Option> options) {
while (Stream.of(Option.values()).anyMatch(option -> option.isFeasible(options))) {
for (Option option : Option.values()) {
if (option.isFeasible(options)) {
options.add(option);
}
}
}
return options;
}
}
enum Option {
A(15),
B(10),
C(8) {
@Override
boolean isFeasible(List<Option> options) {
return super.isFeasible(options) && options.stream()
.filter(option -> option == A)
.count() >= 3;
}
};
private final int maxRepeats;
Option(int maxRepeats) {
this.maxRepeats = maxRepeats;
}
boolean isFeasible(List<Option> options) {
return options.stream()
.filter(option -> option == Option.valueOf(this.name()))
.count() < this.maxRepeats;
}
}
Metoda wypisuje poprawnie potwórzenia (wraz z ilością i warunkami):
[[A, B, A, B, A, B, C, A, B, C, A, B, C, A, B, C, A, B, C, A, B, C, A, B, C, A, B, C, A, A, A, A, A]]
Niestety ale to dopiero pierwsza kombinacja. Jak mogę stworzyć warunek w którym będę powtarzać to dopóki lista nie będzie posiadać wszystkich możliwych kombinacji?