Eigentlich sollten zwei Schleifen reichen. Mit der äußeren zählst du rechts die "Einer" hoch und mit der inneren behandelst du den Überlauf ggf. bis ganz nach links.Wenn ich ein weiteres Zeichen machen will, brauche ich eine weitere verschachtelte for-Schleife.
public class Buchstaben {
/**
* Reinterpretiere die gegebene Zahl zur Basis 26 und
* konkateniere zu einem String.
*/
private static String cvt(long v) {
return v --> 0 ? cvt(v / 26) + (char) ('A' + v % 26) : "";
}
/**
* Erzeuge Stream zum Generieren beliebig langer Strings.
*/
private static java.util.stream.Stream<String> strings() {
return java.util.stream.LongStream
.iterate(1, i -> i + 1)
.mapToObj(Buchstaben::cvt);
}
/**
* Anzahl an benötigten Strings/Zeilen für genau `n` 'Z's.
*/
private static long numStringsFor(int n) {
return n > 0 ? 26 * (numStringsFor(n - 1) + 1) : 0;
}
public static void main(String[] args) {
// Gebe 'A' .. 'ZZZZ' aus:
strings()
.limit(numStringsFor(4))
.forEach(System.out::println);
}
}
public void next(StringBuilder b) {
int n = b.length();
int i = 0;
boolean carry = true;
while (carry && i < n) {
char ch = (char)(b.charAt(i) + 1);
carry = ch > 'Z';
b.setCharAt(i, carry ? 'A' : ch);
i++;
}
if (carry) {
b.append('A');
}
}
void next(StringBuilder s, int i) {
if (i >= s.length()) {
s.append('A');
} else {
char ch = (char)(s.charAt(i) + 1);
s.setCharAt(i, ch > 'Z' ? 'A' : ch);
if (ch > 'Z') {
next(s, i+1);
}
}
}
Falls dort keine Stelle ist (Index == 0) links am String ein A anfügen.