package jscl.util; import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.List; public class ExpressionGeneratorWithInput extends AbstractExpressionGenerator<List<String>> { @Nonnull private final List<String> subExpressions; public ExpressionGeneratorWithInput(@Nonnull List<String> subExpressions) { this(subExpressions, 10); } public ExpressionGeneratorWithInput(@Nonnull List<String> subExpressions, int depth) { super(depth); this.subExpressions = new ArrayList<String>(subExpressions); } public static void main(String... args) { final ArrayList<String> input = new ArrayList<String>(); input.add("3"); input.add("0x:fed"); input.add("0b:101"); for (String expression : new ExpressionGeneratorWithInput(input, 20).generate()) { System.out.println(expression); } } @Nonnull public List<String> generate() { final List<StringBuilder> expressions = new ArrayList<StringBuilder>(); for (String subExpression : subExpressions) { expressions.add(new StringBuilder(subExpression)); } int i = 0; while (i < getDepth()) { final Operation operation = generateOperation(); final Function function = generateFunction(); final boolean brackets = generateBrackets(); for (int j = 0; j < subExpressions.size(); j++) { final StringBuilder expression = expressions.get(j); expression.append(operation.getToken()); if (function == null) { expression.append(subExpressions.get(j)); } else { expression.append(function.getToken()).append("(").append(subExpressions.get(j)).append(")"); } if (brackets) { expressions.set(j, new StringBuilder("(").append(expression).append(")")); } } i++; } final List<String> result = new ArrayList<String>(); for (StringBuilder expression : expressions) { result.add(expression.toString()); } return result; } }