# FOR Schleife mit Char



## Rohezal (3. Feb 2004)

Hi,
im folgenden Programmteil sollen alle möglichen Worte von "Aaaaa" bis "Zzzzz" durchgegangen werden. Java scheint keine Probleme damit zu haben, einen Char gleichzeitig als Buchstaben und als Zahl zu betrachten. Allerdings macht es Probleme, wenn ich versuche, die Chars zu nem Wort zusammenzufügen... Woran liegt das?


```
char c1='A'; //Variablen inizialisieren
    	char c2='a';
    	char c3='a';
    	char c4='a';
    	char c5='a';
    	String s="Aaaaa";

    	for (c1 = 'A'; c1 < 'Z'+1; c1++) //Durchgehen aller Kombinationsmöglichkeiten
    	{
    		for (c2 = 'a'; c2 < 'z'+1; c2++)
    		{
    			for (c3 = 'a'; c3 < 'z'+1; c3++)
    			{
    				for (c4 = 'a'; c4 < 'z'+1; c4++)
    				{
    					for (c5 = 'a'; c5 < 'z'+1; c5++)
    					{
    						s=c1+c2+c3+c4+c5;  //Zusammenfügen des Wortes, hier kommt ein "incompatible types" Fehler
    					}
    				}
    			}
    		}
    	}
```


Edit: Wenn ihr, außer mir nen Hinweis zu geben, wo das Problem liegt, mich noch auf nen gutes Tutorial verweisen könntet, wär's nett. Weil das, was ich hier hab, gefällt mir nicht so.


----------



## Reality (3. Feb 2004)

Hi,
versuch das mal ohne Zahlen. Ich glaube hier liegt der Fehler.

Liebe Grüße
Reality


----------



## Rohezal (3. Feb 2004)

Also ich hab noch nen bisschen rumprobiert und zwei Dinge festgestellt:

1.

```
s=c1+c2+c3+c4+c5;  //Compilieren bricht mit "Incompatible Type" ab
s="Test"+c1+c2+c3+c4+c5;  //geht
```

Warum?

2.
Wenn ich das Programm mit der zweiten Zeile compilieren lasse, geht alles, aber dann beim ausführen kommt ein "Array out of bounds" Error. 


Ich hab mal aus dem 'Z'+1 etc. ein 'Z' gemacht, aber das scheint ihm egal zu sein. Ich nehm an, da das c1++ auch ein numerischer Operator ist, besteht das Problem weiterhin. Wie kann ich denn aus einer Zahl den Buchstaben mit dem entsprechenden Ascii Code machen? Weil dann könnt ich einfach fünf Zahlen durchlaufen lassen und die jeweils in Buchstaben umwandeln...


----------



## Nobody (3. Feb 2004)

tipp:
speichere das ganze in nem array und arbeite dann mitm index


----------



## Rohezal (3. Feb 2004)

Danke, auf das mit dem Array hätt ich auch mal selbst kommen können.  
Hast du noch ne Idee wegen zum Zusammenfügen der Chars zu nem String? Denn

```
s=table[c1]+table[c2]+table[c3]+table[c4]+table[c5];
```
mag er immer noch nicht, sondern nur, wenn ich

```
s="A"+table[c1]+table[c2]+table[c3]+table[c4]+table[c5];
```
nehme...


----------



## stev.glasow (4. Feb 2004)

Und so?

```
StringBuffer buf = new StringBuffer();
buf.append(char1);
buf.append(char2);
buf.append(char3);
String wort = buf.toString();
```
Oder du baust die einen char-Array, der wie folgt aus sieht zusammen: {'w', 'o', 'r', 't'}
dann kannst du diesen Array einfach dem String-Konstrukor übergeben:

```
String wort = String(charArray);
```


----------



## René Link (4. Feb 2004)

Hi,

das Problem ist, dass du auf der rechten Seite des Ausdrucks nur chars hast.
Der + Operator ist so definiert, dass er einen char zurückgibt, wenn beide
Operanden vom Typ char sind. Deshalb bekommst du insgesamt ein char zurück.
Diesen versuchst du dann einer Variablen zuzuweisen, die aber nur Referenzen
auf String-Objekte aufnehmen kann. Deshalb beschwert sich der Compiler.

Wenn du aber ein String-Literal verwendest und dann den + Operator anwedest,
wird dein char in einen String konvertiert ( Character.toString(char c) ).

Die Methode von stevg einen StringBuffer zu verwenden ist sauber.
Nur setzt die Instanzierung des StringBuffer-Objekts bitte auserhalb der Schleifen.
Sonst hat der StringBuffer nur wenig Sinn, weil du in der inneren Schleife jedesmal
ein neues Objekt erzeugen würdest. Die Referenz auf dieses geht beim nächsten Schleifen-
durchlauf verlohren und das bedeutet der Gerbage Collector bekommt eine Menge arbeit.

Also


```
char c1='A'; //Variablen inizialisieren 
       char c2='a'; 
       char c3='a'; 
       char c4='a'; 
       char c5='a'; 
       StringBuffer buff = new StringBuffer();

       for (c1 = 'A'; c1 < 'Z'+1; c1++) //Durchgehen aller Kombinationsmöglichkeiten 
       { 
          for (c2 = 'a'; c2 < 'z'+1; c2++) 
          { 
             for (c3 = 'a'; c3 < 'z'+1; c3++) 
             { 
                for (c4 = 'a'; c4 < 'z'+1; c4++) 
                { 
                   for (c5 = 'a'; c5 < 'z'+1; c5++) 
                   { 
                      buff.append(c1); 
                      buff.append(c2); 
                      buff.append(c3); 
                      buff.append(c4); 
                      buff.append(c5); 
                      
                      System.out.println(buff.toString()); // irgendetwas mit dem String machen
                      
                      buff.delete(0, buff.length());    // Reset des Buffers
                   } 
                } 
             } 
          } 
       }
```


----------



## Rohezal (4. Feb 2004)

Vielen Dank, hab mal die letzte Lösung verwendet und alles scheint zu gehen...


----------



## Nobody (4. Feb 2004)

ps sieht verdächtig nach nem bruteforce aus.

wenn ja: vergiss das in java zu lösen, dazu ists definitiv zu langsam:

in assembler geschrieben für die alle buchstaben (gross + klein)+zahlen bei 8(!!) zeichen:
dauer:497 tage (mit nem 1,5ghz rechner)

viel spass beim warten


----------

