# char-Array in int-Array umwandeln



## JG12111989 (29. Jul 2015)

Hallo zusammen,

ich habe ein kleines Problem und zwar möchte ich ein Array, das mit char gefüllt ist, die aber ALLE Ziffern sind, in einen int-Array umwandeln.

Hier ist erstmal der Quellcode:

```
package lernsituation_3;
import java.io.*;

class Schluessel {
  
    private char [][]schluessel= new char [5][6];
  
    private static void printArray(char[][] a)
    {
        for(int i = 0; i < a.length; i++)
        {
          for(int j = 0; j < a[i].length; j++)
          {
            if(a[i][j] > 0) System.out.print(a[i][j]);
            else System.out.print(" ");
          }
          System.out.println();
        }
    }
    private static boolean contains(String s, char c)
    {
        return s.indexOf(Character.toLowerCase(c)) >= 0 ||
               s.indexOf(Character.toUpperCase(c)) >= 0;
    }
  
    public void schlErstellen() throws IOException {
      
      
        char []alph={'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
                     'O','P','Q','R','S','T','U','V','W','X','Y','Z',' '};
        BufferedReader lesen = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Bitte Schluessel eingeben: ");
      
        String schl = lesen.readLine();
        int zeilen = schluessel.length;
        int spalten = schluessel[0].length;

        int i = 0;
        for(int j = 0; j < schl.length() && i < zeilen*spalten; j++) {
          if(schl.indexOf(schl.charAt(j)) == j) {
            schluessel[i/spalten][i%spalten] = schl.charAt(j);
            i++;
          }
        }
        for(int j = 0; j < alph.length && i < zeilen*spalten; j++) {
          if(!contains(schl, alph[j])) {
            schluessel[i/spalten][i%spalten] = alph[j];
            i++;
          }
        }
        printArray(schluessel);
    }
  
    public void verEntSchl() throws IOException {
      
        String s; char []verschl;
        BufferedReader lesen = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Bitte (verschlüsselten) Text eingeben: ");
        s= lesen.readLine();verschl= s.toCharArray();
      
        if(verschl[0]=='1'||verschl[0]=='2'||verschl[0]=='3'||verschl[0]=='4'||
           verschl[0]=='5'||verschl[0]=='6')
        {
            int []entschl;
            for(int u=0; u<verschl.length; u++)
            {
                int p=0;
                entschl[p]=Integer.parseInt(verschl[u]);
                p++;
            }
          
            int i=0, j=1;
          
            while(i<entschl.length&&j<entschl.length)
            {
                int a=entschl[i]; a=a-1;
                int b=entschl[j]; b=b-1;
                System.out.print(schluessel[a][b]);
                i=i+2; j=j+2;
            }
            System.out.println();
        }
        else
        {
            for(int i=0; i<verschl.length; i++)
            {
                for(int j=0; j<schluessel.length; j++)
                {
                    for(int b=0; b<schluessel[0].length; b++)
                    {
                        if(verschl[i]==schluessel[j][b])
                        {
                            j=j+1; b=b+1;
                            int v=0; v=j*10+b;
                            System.out.print(v+" ");
                        }
                    }
                }
            }
        }
    }
}

public class Lernsituation_3 {

    public static void main(String[] args) throws IOException {
  
        Schluessel test=new Schluessel();
        test.schlErstellen();
        test.verEntSchl();
    }
  
}
```

In der Methode verEntSchl lese ich ein Wort oder eine Zahlenfolge ein. Diesen String wandle ich in einen char-Array um, damit ich jedes Zeichen (egal ob Buchstabe oder Zahl) auf einer Stelle im Array hab.
Danach wird via if überprüft, ob es sich um Zahlen handelt, wenn das der Fall ist, brauche ich den Inhalt des Array aber als int und nicht mehr als char, damit ich damit weiterrechnen kann.

Ich hab gedacht, ich könnte mit Integer.parseInt arbeiten, aber da erscheint die Fehlermeldung, dass dies nur bei String funktioniert...

Kann mir jemand weiterhelfen?


----------



## InfectedBytes (29. Jul 2015)

warum muss es denn unbedingt ein int sein?
chars sind auch nichts weiter als zahlen. Du kannst also auch mit chars "normal" weiterrechnen.

```
'a' + 5 - '0' //usw.
```

Ansonsten kannst du einfach ein char in einem int speichern:

```
int i = 'a';
```

edit: Vermutlich willst du das:

```
char c = ...;
int value = c - '0';
```
Wenn dein char eine Ziffer ist, so wird der entsprechende Wert davon in value gespeichert. 
Kannst ja mal nach ASCII googlen


----------



## VfL_Freak (30. Jul 2015)

Moin,

mal ein kleiner Tipp am Rande ...

Gewöhne Dir gar nicht erst Bezeichnernamen wie "_verEntSchl_" an! Glaub' mir, nach wenigen Wochen weißt Du selbst niocht mehr, was das heißen sollte!
Immer nur _sprechende Bezeichner_ benutzen !!

Auch für 'i', 'j' oder 'b' kannst Du besser Begriffe wie _zaehler_, _anzahl_ etc. nutzen !!

Gruß Klaus


----------



## JG12111989 (30. Jul 2015)

@InfectedBytes
Wenn ich die chars nicht umwandle, sondern versuche, so mit ihnen zu rechnen, erhalte ich eine OutOfBounceException....

Mein Code für die betreffende if-Schleife:

```
String s; char []verschl;
  BufferedReader lesen = new BufferedReader(new InputStreamReader(System.in));
  System.out.println("Bitte (verschlüsselten) Text eingeben: ");
  s= lesen.readLine();verschl= s.toCharArray();

if(verschl[0]=='1'||verschl[0]=='2'||verschl[0]=='3'||verschl[0]=='4'||
  verschl[0]=='5'||verschl[0]=='6')
  {
  
  int i=0, j=1;
  
  while(i<verschl.length&&j<verschl.length)
  {
  int a=verschl[i]; a=a-1;
  int b=verschl[j]; b=b-1;
  System.out.print(schluessel[a][b]);
  i=i+2; j=j+2;
  }
  System.out.println();
  }
```

Vorher hatte ich meinen Methodenrumpf getestet, indem ich das int-Array per Hand gefüllt habe und da lief alles einwandfrei. Das Problem liegt also definitiv bei der Umwandlung....


----------



## VfL_Freak (30. Jul 2015)

Moin,

"ArrayIndexOutOfBounceException" bedeutet, dass Du auf einen Index des Arrays zugreifen willst, den es nicht gibt!
Bsp.: ein Array der Länge 5 hat die Indices 0 - 4. Ein Zugriff "myArray[5]" würde also diese Exception werfen !

In welcher Zeile tritt sie bei Dir denn _*genau*_ auf ?

Ich vermute mal folgendes:
"schluessel" ist mit "[5][6]" deklariert, also wird irgendwann der Zugriff auf den ersten Index fehlschlagen, da "verschl" ja 6 Zeichenlang zu sein scheint !!

Gruß Klaus


----------



## JG12111989 (30. Jul 2015)

Der Fehler tritt in der Zeile auf, in der der 
	
	
	
	





```
schluessel[a] [b
```
ausgegeben wird, genau.
Aber ich kann nicht nachvollziehen, woher der Fehler kommt. Wenn ich mir ein int-Array schreibe, per Hand befülle und damit weiterarbeite


```
int array[]={1,2,3,4};
```

läuft es problemlos und ohne ArrayIndexOutOfBounceException.




VfL_Freak hat gesagt.:


> da "verschl" ja 6 Zeichenlang zu sein scheint



Die Länge vom Array verschl hängt vom Benutzer und seiner Eingabe ab...


----------



## VfL_Freak (30. Jul 2015)

Moin,

ich verstehe nicht so wirklich, was Du innerhalb der whilfe-Schleife erreichen willst ... aber:

```
int i=0, j=1;
while( i<verschl.length && j<verschl.length ) // also solange "i < 6" + "j < 6"
{
  int a = verschl[i];
  a--;  // wozu ??
  int b = verschl[j];
  b--; // wozu??
  System.out.print(schluessel[a][b]);
  i += 2; j += 2;  // wozu ??
}
```

dann kommt der erste Durchlauf mit i = 0, j = 1
a = 0
a = -1 
b = 1
b = 0
schluessel[-1][0]  *===> '-1' ist KEIN gültiger Index !!*

danach wäre übnrigens i = 2 und j = 3, aber den Sinn verstehe ich nicht

Gruß Klaus


----------



## JG12111989 (30. Jul 2015)

Wenn i=0, wird der Inhalt von verschl[0] auf a gesetzt und nicht 0 selber!
also nicht a=0, sondern a=verschl[0]
Und in verschl[i stehen nur zahlen von 1-6. Also wird mein a nie kleiner als 0.
Dasselbe gilt für j und b.


----------



## VfL_Freak (30. Jul 2015)

Moin,



JG12111989 hat gesagt.:


> Wenn i=0, wird der Inhalt von verschl[0] auf a gesetzt und nicht 0 selber!
> also nicht a=0, sondern a=verschl[0]


ok, hast natürlich Recht, da war ich zu schlurrig  mea culpa



JG12111989 hat gesagt.:


> Und in verschl_ stehen nur zahlen von 1-6_


_das muss aufgrund Deiner Prüfung nicht zwingend so sein! 
Nur in "verschl[0]" stehen zwingend Zahlen von 1-6, der Rest könnte sonstwas enthalten, da Du es nicht prüfst

Aber auf dem papier ist da jetzt eh mühsam ...
Setz' einfach in der Zeile "System.out.print(schluessel[a])"_ einen Breakpunkt und schau Dir im Debugger die Werte von a und b an!
Dann wirst Du schnell sehen, wann der Index verletzt wird!

Gruß Klaus


----------



## JG12111989 (30. Jul 2015)

VfL_Freak hat gesagt.:


> Nur in "verschl[0]" stehen zwingend Zahlen von 1-6, der Rest könnte sonstwas enthalten, da Du es nicht prüfst



Der Benutzer weiß an für sich, dass er nur Zahlen von 1-6 eintippen darf, sonst kann das Programm gar nicht entschlüsseln.....;-)



VfL_Freak hat gesagt.:


> _Setz' einfach in der Zeile "System.out.print(schluessel[a])"_ einen Breakpunkt und schau Dir im Debugger die Werte von a und b an!



........ehrlich gesagt hab ich keine Ahnung vom Debugger...


----------



## JStein52 (30. Jul 2015)

Wenn ich das richtig sehe stehen in verschl doch Ziffern als characters drin also '1', '2'  etc.

müsstest du dann nicht schreiben:

{
  int a = verschl_-'0';
  a--;  // wozu ??_


----------



## InfectedBytes (30. Jul 2015)

in dem Fall kann er auch direkt verschl - '1' rechnen^^


----------



## JStein52 (30. Jul 2015)

Jep, war nur der Klarheit halber.

(und mir ist gedanklich gerade das Java-Code tag abhanden gekommen, da fehlt natürlich der entsprechende Index beim verschl  )


----------



## JG12111989 (30. Jul 2015)

Also, es ist so:

Ich hab mein 2D-Array, in dem ich alle Buchstaben des Alphabets drin habe. 
Im Array verschl hab ich, wenn ich in diese if-Schleife springe, nur Ziffern von 1-6 (als chars, nicht als int) drin. 

Nun gehe ich so vor:
Ich nehme die erste Stelle von verschl, also verschl[0] und die zweite Stelle, also verschl[1]. Diese beiden Inhalte sind dann sozusagen meine Koordinaten für den Buchstaben im 2D-Array, den ich angezeigt haben will. 
Deshalb ab ich die Zählvariablen i=0 und j=1, die, sobald ich den ersten Buchstaben habe, beide um 2 hochgezählt werden, weil ich im nächsten Schritt i=2 und j=3 brauche. Ich will eben immer die Ziffern als Zweierpärchen verwenden

Wenn ich jetzt zB. mit verschl[0] und verschl[1] die Koordinaten für meinen ersten Buchstaben gefunden habe (nehmen wir mal an, der Buchstabe sei ein A), setze ich diese Koordinaten als neue int a und int b und ziehe von beiden 1 ab, also a-1 und b-1, weil mein 2D-Array beginnt bei 0 zu zählen und nicht bei eins. 
Ich hab das auch getestet, es läuft so, wenn ich den Inhalt von verschl per Hand eingeben, also bspw. int array={1,2,3,4};. 
Hieran wird es also definitiv nicht liegen


----------



## InfectedBytes (30. Jul 2015)

wie gesagt, dein problem wird sein das im Array eben '1', '2', ... drinsteht. 
Das sind aber die ASCII werte, als Zahl haben diese den Wert:
'0' = 48
'1' = 49
'2' = 50
...
Dementsprechend musst du eben '0' bzw '1' von deinem char Wert abziehen.


----------



## JG12111989 (30. Jul 2015)

@InfectedBytes
Achsoooooo, jetzt hab ich es verstanden!! Vielen Dank!! Werde das direkt mal ausprobieren!!!!!

Aber gibt es nicht auch noch eine Möglichkeit, meine chars in ints umzuwandeln? Nur mal so am Rande? Das scheint mir von der Logik her leichter.... Von String in char-Array ist ja zum Vergleich sehr einfach umzusetzen...


----------



## JStein52 (30. Jul 2015)

Das was wir dir versuchen zu sagen ( '0' subtrahieren)  *ist *die Umwandlung von character in die integer-Zahl die sie repräsentieren !!!


----------



## VfL_Freak (30. Jul 2015)

Moin,

richtig! 

```
// Entweder
char c = '5'; // '5' hat den Wert 53 oder 0x35
int i = (int)(c - '0');

// oder
char c = '5';
int i = (int)(c - 48);
```

Gruß Klaus


----------



## JG12111989 (30. Jul 2015)

Ich habe nun folgenden Code erstellt:

```
String s; char []verschl;
  BufferedReader lesen = new BufferedReader(new InputStreamReader(System.in));
  System.out.println("Bitte (verschlüsselten) Text eingeben: ");
  s= lesen.readLine();verschl= s.toCharArray();
   
  if(verschl[0]=='1'||verschl[0]=='2'||verschl[0]=='3'||verschl[0]=='4'||
  verschl[0]=='5'||verschl[0]=='6')
  {
  int []entschl;
  for(int u=0; u<verschl.length; u++)
  {
  int p=0;
  char c=verschl[u];
  int temp = (int)(c - '0');
  entschl[p]=temp;
  p++;
  }
   
  int i=0, j=1;
   
  while(i<entschl.length&&j<entschl.length)
  {
  int a=entschl[i]; a=a-1;
  int b=entschl[j]; b=b-1;
  System.out.print(schluessel[a][b]);
  i=i+2; j=j+2;
  }
  System.out.println();
  }
```
Nun wird dieser Fehler gemeldet:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - variable entschl might not have been initialized
??


----------



## VfL_Freak (30. Jul 2015)

Moin,

WO tritt der Fehler auf ?? 
Sollen wir die Zeile raten ?? 

Poste den gesamten Stacktrace, da steht die Stelle doch genau drin  ..... isses denn so schwer ?? 

BTW: "variable entschl might not have been initialized" ist doch ziemlich eindeutig, oder ??

Gruß Klaus


----------



## JG12111989 (30. Jul 2015)

VfL_Freak hat gesagt.:


> BTW: "variable entschl might not have been initialized" ist doch ziemlich eindeutig, oder ??


Ja, ist klar. Aber wie kann ich das ändern?

Fehler:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - variable entschl might not have been initialized
   at testumgebung.Schluessel.verEntSchl(Testumgebung.java:71)
   at testumgebung.Testumgebung.main(Testumgebung.java:115)
Java Result: 1

in dieser Zeile:

```
entschl[p]=temp;
```


----------



## VfL_Freak (30. Jul 2015)

Moin,



JG12111989 hat gesagt.:


> Ja, ist klar. Aber wie kann ich das ändern?


Indem du sie initialisiert ?????
Du kannst nicht nur was zuweisen ...

Was ist denn das für eine Frage 

Gruß Klaus


----------



## JStein52 (30. Jul 2015)

Probiere es mal so:


```
int entschl[] = new int[verschl.length];
```


----------



## JG12111989 (30. Jul 2015)

Jetzt bin ich OutOfBounce: -1


```
String s; char []verschl;
  BufferedReader lesen = new BufferedReader(new InputStreamReader(System.in));
  System.out.println("Bitte (verschlüsselten) Text eingeben: ");
  s= lesen.readLine();verschl= s.toCharArray();
   
  if(verschl[0]=='1'||verschl[0]=='2'||verschl[0]=='3'||verschl[0]=='4'||
  verschl[0]=='5'||verschl[0]=='6')
  {
  int entschl[] = new int[verschl.length];
  for(int u=0; u<verschl.length; u++)
  {
  int p=0;
  char c=verschl[u];
  int temp = (int)(c - '0');
  entschl[p]=temp;
  p++;
  }
   
  int i=0, j=1;
   
  while(i<entschl.length&&j<entschl.length)
  {
  int a=entschl[i]; a=a-1;
  int b=entschl[j]; b=b-1;
  System.out.print(schluessel[a][b]);//---> hier OutOfBounce
  i=i+2; j=j+2;
  }
  System.out.println();
  }
```


----------



## JStein52 (30. Jul 2015)

Wobei du meines Erachtens diesen ganzen Block mit dem "entschl" weglassen kannst, es sei denn du brauchst es später für was anderes noch. Vereinfacht konnte das Codestück so aussehen:


```
for (int i=0, j=1;i<verschl.length&&j<verschl.length; i++, j+=2)
  {
  int a=verschl[i]-'1';
  int b=verschl[j]-'1';
  System.out.print(schluessel[a][b]);
  }
```


----------



## JStein52 (30. Jul 2015)

Lass dir doch mal das verschl - Array ausgeben !!! (oder mit Debugger anschauen)


----------



## JG12111989 (30. Jul 2015)

DANKE!! Nach einer kleinen Veränderung deines Vorschlags läuft es nun. @JStein52


----------



## JStein52 (30. Jul 2015)

Dein Code ist ein bisschen gefährlich. Wenn in deinem "verschl"-Array einmal Werte kleiner '1' drin stehen wirst du immer auf diesen Fehler laufen. (weil dann c-'1' negativ wird und du später dies als Index verwendest. (Und in meinem Post oben hatte ich nicht beachtet dass i ja auch um 2 inkrementiert wird.)

Edit:  Ok, du hattest es wohl bemerkt


----------

