class Counter {
// Basis des Zählers = Anzahl des Alphabets.
// Beispiel: Alphabet = "abc" , also Basis = 3
// 0,1,2, 00,01,02, 10,11,12,20,21,22, 000,001,002, ...
private ArrayList<Integer> zählerstand;
private int first;
private int last;
private final char[] alphabet;
public Counter() {
String alphabet = "abc";
this.alphabet = alphabet.toCharArray();
zählerstand = null;
first = 0;
last = this.alphabet.length - 1;
}
// Ein Kilometerzähler zur Bais n wird um 1 hochgezählt.
public String getAndIncrementZählerstand() {
int anz;
int i;
// Es gibt keinen Überlauf
boolean überlauf = false;
int lastPos = -1;
ArrayList<Character> listeNeu;
String zählerstandString = null;
if (zählerstand == null) {
zählerstand = new ArrayList();
// am Anfang ein first (0) einfügen
zählerstand.add(0, first);
zählerstandString = zählerstandAlsString();
return zählerstandString;
}
// Anzahl der Stellen des Zählers
anz = zählerstand.size();
// Bestimme letzte Stelle des Zählers , deren Wert noch erhöht werden
// kann, ohne dass es einen Überlauf gibt.
überlauf = true;
for (i = anz - 1; i >= 0; i--) {
if (zählerstand.get(i) != last) {
lastPos = i;
überlauf = false;
break;
}
}
// Alle Elemente sind mit last belegt d.h. es gibt einen Überlauf
// ganz vorne an der 0-ten Stelle
if (überlauf == true) {
// alle Stellen mit first (0) belegen
for (i = 0; i < anz; i++) {
zählerstand.set(i, first);
}
// am Anfang ein first (0) einfügen
zählerstand.add(0, first);
} else { // Es gibt keinen Überlauf
// alle Elemente ab lastPos+1 mit first belegen und lastPos um 1
// erhöhen.
for (i = lastPos + 1; i < anz; i++) {
zählerstand.set(i, first);
}
int wert = zählerstand.get(lastPos);
zählerstand.set(lastPos, wert + 1);
}
zählerstandString = zählerstandAlsString();
return zählerstandString;
}
public String zählerstandAlsString() {
StringBuffer sb = new StringBuffer();
int index;
for (int i = 0; i < zählerstand.size(); i++) {
index = zählerstand.get(i);
char c;
c = alphabet[index];
sb.append(c);
}
return sb.toString();
}
public String toString() {
String temp;
temp = zählerstand.toString();
// vorsichtshalber Schrott entfernen
temp = temp.replace("[", "");
temp = temp.replace("]", "");
temp = temp.replace(",", "");
temp = temp.replace(" ", "");
return temp;
}
}
[QUOTE="mihe7, post: 1197582, member: 58041"]
Ich gehe mal nicht davon aus, dass Du mehr als 2 Mrd. Dateinamen brauchst, oder? Dann reicht ein einfaches int um die Namen durchzuzählen.
Wenn Du die Zahl auf einen Strings abbilden willst, die aus einem Alphabet mit n Symbolen aufgebaut sind, dann betrachtest Du den String einfach als Zahl zur Basis n, also etwa:
[code=Java]
public class Counter {
private final char[] alphabet;
private int value;
public Counter(String alphabet) {
this.alphabet = alphabet.toCharArray();
}
public String getAndIncrement() {
String result = toString();
value++;
return result;
}
@Override
public String toString() {
StringBuilder b = new StringBuilder();
int cur = value;
int n = alphabet.length;
while (cur > 0) {
b.insert(0, alphabet[cur % n]);
cur /= n;
}
if (b.length() == 0) {
b.append(alphabet[0]);
}
return b.toString();
}
public static void main(String[] args) {
Counter c = new Counter("abcdefghijklmnopqrstuvwxyz0123456789");
for (int i = 0; i < 10000; i++) {
System.out.println(i + ": " + c.getAndIncrement());
}
}
}