No, popravdě to jediný kód. Ten, co jsem zmínil, se mně líbil právě v předání těch znaků v jednom řetězci, avšak existuje ještě tento
String[] array = new String[]{"a", "b", "c", "d"};
public static List<String> create(int maxLength, String[] array){
List<String> strings = new ArrayList<>();
strings.addAll(create("",0, maxLength, array));
return strings;
}
private static List<String> create(String current, int currentLength, int maxLength, String[] array){
List<String> strings = new ArrayList<>();
if(currentLength < maxLength){
for(int x=0;x<array.length;x++){
strings.addAll(create(current + array[x],currentLength + 1, maxLength, array));
}
}else{
strings.add(current);
}
return strings;
}
A pak ještě tento
var chars = new char[] {'a', 'b', 'c'};
int variations = 3;
var length = chars.length;
var list = new ArrayList<String>();
StringBuilder out = new StringBuilder();
for (int i = 0; i < variations; i++) out.append(chars[0]);
top:
while (true) {
list.add(out.toString());
for (int pos = variations - 1; pos >= 0; pos--) {
char c = out.charAt(pos);
int cPos = Arrays.binarySearch(chars, c);
if (cPos < length -1) {
// We can just increment this one and we're done
out.setCharAt(pos, chars[cPos + 1]);
continue top;
} else {
// 9-> 10: Every 'lower' digit is reset to first (0).
out.setCharAt(pos, chars[0]);
}
}
break;
}
Který kód je ale nejoptimálnější, to nevím. To bych musel napsat JUnit test. Nicméně, momentálně to není podstatné, protože vždy to zhavaruje stejnou chybou.
A pokud je vytváříš rychleji, než se stihne uklízet, tak ti dojde paměť.
V tom případě by stačilo použít System.gc();. Otázkou je, kam ho přesně dát a jestli by to pomohlo.