2D Array mit Array[] füllen

JG12111989

Mitglied
Hallo zusammen,

ich arbeite nun seit einem halben Jahr mit Java, habe aber mit Arrays immer wieder Problem... Ich versuche derzeit ein zweidimensionales Array mit zwei Arrays zu füllen.

Es geht darum, dass ich ein zweidimensionales Array mit den Buchstaben des Alphabets füllen will (+ Leerstelle), wobei der Benutzer ein Wort eingibt, welches zuerst ins 2D-Array geschrieben wird und anschließend wird das 2D-Array noch mit den fehlenden Buchstaben des Alphabets gefüllt. Dabei soll immer überprüft werden, ob ein Buchstabe nicht schon im 2D-Array steht, damit es nicht zu Doppelungen kommt.

Hier ist mein Code:
Code:
package lernsituation_3;
import java.io.*;

class Schluessel {
   
    private int []verschl;
    private char []entschl;
    private char [][]schluessel= new char [5][6];
   
    public void schlErstellen() throws IOException {
       
        String s;
        char []schl; 
        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: ");
        s= lesen.readLine(); schl= s.toCharArray();
       
        for(int i=0; i<=schluessel.length; i++)
        {
            for(int j=0; j<=schluessel.length; j++)
            {
                for(int z=0; z<=schl.length; z++)
                {
                    for(int u=0; u<=schluessel.length; u++)
                    {
                        if(u!=schl[z]){schluessel[i][j]=schl[z];}
                    }
                }
                for(int o=0; o<=alph.length; o++)
                {
                    for(int u=0; u<=schluessel.length; u++)
                    {
                        if(u!=alph[o]){schluessel[i][j]=alph[o];}
                    }
                }
            }
        }
    }
}

public class Lernsituation_3 {

    public static void main(String[] args) throws IOException {
   
        Schluessel test=new Schluessel();
        test.schlErstellen();
    }
   
}
 
Du bekommst immer eine ArrayIndexOutOfBoundsException! Du musst, wenn du den Schleifenzähler bei 0 anfangen lässt < und nicht <= verwenden.
Was mir noch aufgefallen ist, ist dass du bei der 2. Schleifenbedingung die selbe hast wie in der ersten. Wenn du die länge der 2. Dimension auslesen möchtest musst du statt
Code:
schluessel.length
Code:
schluessel[0].length
verwenden.
mfg Diabolus
 
Okay, auf den ArrayIndexOutOfBoundsException-Grund hätte ich selber kommen können........

Aber es funktioniert dennoch nicht. Ich versuche mein 2D-Array damit auszugeben:
Code:
for(int a=0; a<schluessel.length; a++)
  {
        for(int b=0; b<schluessel[0].length; b++)
        {
              System.out.print(schluessel[a][b]);
        }
  }

Aber es werden nur leere Stellen ausgegeben. Das Füllen des 2D-Arrays funktioniert also definitiv nicht.......
 
Deine Aufgabenstellung ist verdammt merkwürdig, was willst du machen? Gib eventuell auch ein Beispiel an.
 
Ich bin mir auch nicht sicher was genau in das Array geschrieben werden soll. Aber versuch mal das hier.

Java:
System.out.println("Bitte Schluessel eingeben: ");
String schl = lesen.readLine();

for(int i = 0, z = 0; i < schluessel.length; i++) {
  for(int j = 0; j < schluessel[0].length; j++, z++) {
    if(z < schl.length()) {
      schluessel[i][j] = schl.charAt(z);
    } else {
      schluessel[i][j] = alph[schl.length() - z];
    }
}
 
Danke schon mal für die Mühen!! Ich erkläre es mal etwas genauer.

Ich hab das Array[][] schluessel, in das alles Buchstaben des Alphabets plus Leerstelle geschrieben werden sollen. Es läuft wie folgt ab:

Der Benutzer gibt ein Passwort ein, zB. "MENSCH", welches eingelesen wird.

In das Array[][] wird dann zuerst MENSCH geschrieben und danach alle anderen Buchstaben des Alphabets, die bereits im Array[] alph stehen, wobei es KEINE Doppelungen geben soll. Am Ende würde also im Array[][] stehen:

MENSCH
ABCDFG
IJKLOP
QRSTUV
WXYZ_

* das _ ersetzt die Leerstelle

Anschließend will ich mit diesem Array arbeiten, aber das ist hier unwichtig, weil es mein Problem ist, das Array[][] zu füllen...
 
Dein Array ist 5*6, kann also 30 Zeichen speichern. Du hast aber nur 28 inklusive Leerzeichen und Unterstrich. Wie willst du da eine Dopplung vermeiden?
 
Und was passiert, wenn jemand als Passwort z.B. Teetrinker eingibt? Dann hast du schon mal 3 e's, 2 t's, 2 r's usw. Oder darf ein PW nicht 2x den gleichen Buchstaben haben?
 
Es ist so, dass am Ende in meinem 2D-Array alle Buchstaben des Alphabets + Leerstelle stehen sollen. Die restlichen drei Speicherplätze können leer bleiben.

Selbst wenn der Benutzer ein Wort mit Buchstabendoppelungen als PW eingibt, soll auf Doppelung geprüft werden. sofern der Buchstabe bereits im 2D-Array steht, wird er nicht mehr reingeschrieben, sondern es geht mit dem nächsten Buchstaben weiter.

Bsp. "TEETRINKER":

TERINK
ABCDFG
HJLMOP
QSUVWX
YZ Leerstelle leer leer leer
 
Versuch mal den Code hier
Java:
System.out.println("Bitte Schluessel eingeben: ");
String schl = lesen.readLine();
int zeilen = schluessel.length;
int spalten = schluessel[0].length;

int i = 0;
for(; i < schl.length() && i < zeilen*spalten; i++) {
  schluessel[i/spalten][i%spalten] = schl.charAt(i);
}
for(int j = 0; j < alph.length && i < zeilen*spalten;) {
  if(contains(schl, alph[j])) j++;
  else {
    schluessel[i/spalten][i%spalten] = alph[j];
    i++; j++;
  }
}
 
@DrZoidberg
Es läuft nicht.......... Ich verwende nun folgenden Quellcode:

Code:
package testumgebung;
import java.io.*;

class Schluessel {
   
  private char [][]schluessel= new char [5][6];
   
  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(; i < schl.length() && i < zeilen*spalten; i++) {
  schluessel[i/spalten][i%spalten] = schl.charAt(i);
  }
  for(int j = 0; j < alph.length && i < zeilen*spalten;) {
  if(contains(schl, alph[j])) j++;
  else {
  schluessel[i/spalten][i%spalten] = alph[j];
  i++; j++;
  }
  }

  for(int a=0; a<schluessel.length; a++)
  {
  for(int b=0; b<schluessel[0].length; b++)
  {
  System.out.print(schluessel[a][b]);
  }
  }
  }
   

  private boolean contains(String schl, char alph) {
  throw new UnsupportedOperationException("Not supported yet.");
  }
}

public class Testumgebung {

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

...aber ausgegeben wird nur:

Exception in thread "main" java.lang.UnsupportedOperationException: Not supported yet.
at testumgebung.Schluessel.contains(Testumgebung.java:81)
at testumgebung.Schluessel.schlErstellen(Testumgebung.java:27)
at testumgebung.Testumgebung.main(Testumgebung.java:91)
Java Result: 1
 
...aber ausgegeben wird nur:

Exception in thread "main" java.lang.UnsupportedOperationException: Not supported yet.
at testumgebung.Schluessel.contains(Testumgebung.java:81)
at testumgebung.Schluessel.schlErstellen(Testumgebung.java:27)
at testumgebung.Testumgebung.main(Testumgebung.java:91)
Hast du die Meldung überhaupt gelesen?

In deinem Code steht:
Java:
 private boolean contains(String schl, char alph) {
  throw new UnsupportedOperationException("Not supported yet.");
  }
 
Diesen Teil des Quellcodes hat Netbeans mir automatisch gesetzt. Ich muss zugeben, ich kann mit diesem 'throw new' nicht viel anfangen und hab das 'contains' in der if-Schleife verwendet, weil mir das hier im Thread vorgeschlagen wurde.....
 
Ok, da du dich nicht mit Exceptions auskennst:
Die Methode wirft immer einen Fehler, wenn sie aufgerufen wird. Das ist quasi ein Platzhalter für deinen Code.
Daher auch "Not supported yet."
 
du solltest die methode mit sinnvollem Code ausfüllen.
Warum hast du die Methode überhaupt geschrieben, wenn du nicht weißt was sie machen soll?

Wie gesagt, sie wurde automatisch gesetzt, als ich "contains" in der if-Schleife einfügte, wie ein Mitglied hier im Forum empfahl (s.o.)...

Am besten gehen wir zur Ausgangsfrage zurück, nämlich wie ich mein 2D-Array füllen kann... Bisher bin ich nicht viel weiter als zu Beginn, außer dass die OutOfBounds-Exception nicht mehr kommt.
 
Ok, dann geb ich dir mal das komplette Programm. Das sollte jetzt aber laufen.
Java:
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Test {
  private static 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',' '};
  private static 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 static void main(String[] args) throws Exception {
    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(; i < schl.length() && i < zeilen*spalten; i++) {
      schluessel[i/spalten][i%spalten] = schl.charAt(i);
    }
    for(int j = 0; j < alph.length && i < zeilen*spalten;) {
      if(contains(schl, alph[j])) j++;
      else {
        schluessel[i/spalten][i%spalten] = alph[j];
        i++; j++;
      }
    }
 
    printArray(schluessel);
  }
}
 
@DrZoidberg
Soweit läuft es jetzt schon mal, danke!, wobei Doppelbuchstaben im String schl leider immer noch doppelt ins 2D-Array geschrieben werden.
Wenn ich also "ERDBEERE" eintippe, wirft er folgendes aus:

run:
Bitte Schluessel eingeben:
ERDBEERE
ERDBEE
REACFG
HIJKLM
NOPQST
UVWXYZ
BUILD SUCCESSFUL (total time: 10 seconds)

Und kannst du mir vllt erklären, was in der contains-Methode passiert?
 
So. Jetzt sollte er keine Buchstaben mehr doppelt ausgeben.
Java:
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Test {
  private static 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',' '};
  private static 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 static void main(String[] args) throws Exception {
    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);
  }
}

Die contains Methode prüft, ob der Buchstabe c - entweder als Groß- oder Kleinbuchstabe - irgendwo im String s enthalten ist.
 
Eine kurze Frage, ist das eine Hausübung oder brauchst du sowas für etwas bestimmtes? Musst du das händisch mit Arrays lösen oder geht was übergeordnetes auch?
 
@DrZoidberg
Vielen Dank, jetzt läuft es einwandfrei!!

@Flown
Ich muss ein Programm zum Verschlüsseln von Texten schreiben, bei dem erst ein Passwort eingelesen wird, dann das 2D-Array mit dem restlichen Alphabet plus Leerstelle gefüllt wird, damit ich jeden Buchstaben zur Verfügung habe.

Als nächstes, was aber hier im Quellcode noch nicht vorhanden ist, gibt der Benutzer einen zu verschlüsselnden Text ein und das Programm gibt anschließend anstelle des Textes für jeden Buchstaben die Stelle im 2D-Array aus.

Angenommen das A steht an Stelle schluessel[3][1], so gibt das Programm mir als Verschlüsselung für den Buchstaben A die Zahl 31 aus.
 

Neue Themen


Zurück
Oben