char-Array in int-Array umwandeln

JG12111989

Mitglied
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:
Code:
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?
 
warum muss es denn unbedingt ein int sein?
chars sind auch nichts weiter als zahlen. Du kannst also auch mit chars "normal" weiterrechnen.
Java:
'a' + 5 - '0' //usw.

Ansonsten kannst du einfach ein char in einem int speichern:
Java:
int i = 'a';

edit: Vermutlich willst du das:
Java:
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
 
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
 
@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:
Code:
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....
 
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
 
Der Fehler tritt in der Zeile auf, in der der
Code:
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

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

läuft es problemlos und ohne ArrayIndexOutOfBounceException.


da "verschl" ja 6 Zeichenlang zu sein scheint

Die Länge vom Array verschl hängt vom Benutzer und seiner Eingabe ab...
 
Zuletzt bearbeitet:
Moin,

ich verstehe nicht so wirklich, was Du innerhalb der whilfe-Schleife erreichen willst ... aber:
Java:
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
 
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.
 
Moin,

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

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
 
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.....;-)

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...
 
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 ??
 
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 😵 )
 
Zuletzt bearbeitet:
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
 
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.
 
@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...
 
Moin,

richtig!
Java:
// 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
 
Ich habe nun folgenden Code erstellt:
Code:
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
??
 
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
 
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:
Code:
entschl[p]=temp;
 
Jetzt bin ich OutOfBounce: -1

Code:
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();
  }
 
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:

Code:
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]);
  }
 
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
 

Neue Themen


Zurück
Oben