2-Dimensionaler String: Zahlen verschieben

Lt.Sh4dow

Mitglied
Ich habe ein Problem mit einem 2-Dimensionalem String.
Was ich habe:
1. Aus einer Text-Datei in einem String[][] gespeichert:
Code:
# # # # # # # # 
#           0 # 
#           0 # 
# 1 1 2 2 2 2 # 
# 3 3       4 # 
# 5 5       4 # 
# 6 6 6     4 # 
# # #   # # # #
Ich möchte das die Zahlen darin nach unten fallen, solange Platz ist.
Ich kann den ganzen Block auch schon nach links drehen. Bei dem Fallen komme ich aber nicht weiter:
Java:
    public int dim = 0;                // Dimension der quadratischen Matrix
    public String inh[][];                // Inhalt der Matrix

// Dreht inh[][] gegen den Urzeigersinn um 90° 
        public void Links(){
            String mm[][] = new String[this.dim+1][this.dim+1];
            for (int i = 1; i <= dim-1; i++){
                for (int j = 1; j <= dim-1; j++){
                    mm[i][j] = this.inh[j][dim-i];
                }
            }
            this.inh = mm;
        }
     
        // Lässt alle Sachen innen fallen 
        public void Fallen(){
         
            String mm[][] = new String[this.dim+1][this.dim+1];
          
            for (int z = 2; z< dim; z++){     // geht alle Zeilen duch
                 for (int s = 2;s<=dim-1; s++){// alle Spalten
                   for(int k= 0;k <= 10; k++){ // k = einfach nur eine zahl
                       String s1 = Integer.toString(s);
                  String st = String.valueOf(s1.charAt(z));
if (k = st2){
                         System.out.println("k");
                 }

                 this.inh = mm;
             }
            }
        }

Funktioniert nicht 🙁.
Mein erstes Ziel ist es,dass ich weiss wie ich die Zahlen in ein String bekomme, da hackt es bei mir schon :/

Sorry
 
Zuletzt bearbeitet:
Mein erstes Ziel ist es,dass ich weiss wie ich die Zahlen in ein String bekomme, da hackt es bei mir schon :/
Das machst du doch genau hier:
String s1 = Integer.toString(s)
Ich mach es zwar immer mit
Java:
String.valueOf()
.. tut aber nix zur Sache. Kommt das gleiche bei raus.

if (k = st2)
{

System.out.println("k");
}
Schau mal genau was du hier machst.
- Du setzt k = st2 (du vergleichst diese nicht).
- Zweitens versuchst du hier eine Zahl (k) mit einem String (st2 [den es btw gar nicht gibt?]) zu vergleichen.
- Strings vergleicht man mit equals() [ if (str1.equals(str2) {} ]
- Zahlen vergleichst du mit ==. [ if ( i == k) {} ]

Einen String mit System.out.println() ausgeben tust du wie folgt:
Java:
System.out.println("Meine schöne Zahl: " + k);
 
String[][] ist eher ein dreidimensionales Gebilde:
zweidimensionales Array ist eine Fläche. Auf dieser die Strings beliebig hoch wachsen.
Für 2 Dimensionen reicht ein char[][].
 
Zahlen vergleichst du mit ==. [ if ( i == k) {} ]
Stimmt, habe ich vergessen :/.
ich habe vergessen st2 mit reinzukopieren
Sieht jetzt folgendermaßen aus:
Code:
for (int z = 2; z< dim; z++){     // geht alle Zeilen duch
                for (int s = 2;s<=dim-1; s++){// alle Spalten
                  for(int k= 0;k <= 10; k++){ // k = einfach nur eine zahl
                      String s1 = Integer.toString(s);
                 String st = String.valueOf(s1.charAt(z));
                 int st2 = Integer.parseInt(st);
                     if (k == st2){
                        System.out.println("k");
                }

                this.inh = mm;
            }
           }
         }
       }
Doch dann bekomme ich eine Fehlermeldung :
Code:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 2
    at java.lang.String.charAt(Unknown Source)

Tut mir Leid dass ich so wenig weiß.

Ich komme mir vor als ob ich nix richtig mache, egal was ich versuch.
Im Prinzip will ich ja, wenn unter der Zahl nix ist, das die Zahl nach unten "fällt". Das geht ja in dem man untersucht ob der Punkt darunter == null ist. Nun brauche ich ja aber die Position der Zahl. Und irgendwo da komm ich nicht weiter
 
Zuletzt bearbeitet:
Tut mir Leid dass ich so wenig weiß.

Lass dich nicht entmutigen.. das sind typische Anfängerfehler, die jeder von uns gemacht hat! Und für Unwissenheit sollte man sich nicht Entschuldigen, vielmehr solltest du es als Schritt nach vorne sehen, dass du dein Wissen erweitern willst!

Ein grundlegender Fehler von dir ist glaub ich, dass du nie mit dem selben String Array arbeitest sondern immer ein neues deklarierst. Das heißt du hast 3 versch. String arrays aber nie das gleiche.
Was ich meine ist folgendes.. dein Programm ist ca so aufgebaut:

Java:
public String inh[][];

public static void main(String[] agrs)
{
     // HIER IST DEINE inh Variable GÜLTIG
}

public void links()
{
    // HIER ISt NUR DEINE mm Variable GÜLTIG - NICHT DIE inh
    String mm[][];
}

public void fallen()
{
   // HIER IST EINE NEUE mm Variable GÜLTIG - NICHT DIE AUS links UND NICHT DIE inh Variable
   String[][] mm;
}

Am ende Übergibst du zwar immer den Inhalt deiner lokal variable an deine global inh var, aber da deine lokale Variablen immer leer sind, wird deine globale inh Variable auch leer. (bzw werden Sie mit 0 initialisiert, da bin ich mir gerade aber nicht sicher).

Was du also machen solltest um immer mit der selben Variable zu arbeiten, ist sie als Parameter zu übergeben bspw. so:

Java:
public void links(String[][] localMatrix)
{
     for(.. ; .. ; ..)
     {
              ....
     }
}

for (int z = 2; z< dim; z++){ // geht alle Zeilen duch
Warum fängst du bei 2 an? Du willst sicherlich in der 2. Zeile anfangen. Dazu musst du z = 1 setzen.. warum? Weil man immer bei 0 Anfängt zu zählen.. die 1. Zeile hat den Index 0, die 2. Zeile den Index 1, 3 hat Index 2, etc..

for (int s = 2;s<=dim-1; s++){// alle Spalten
Das selbe gilt für hier. Bei 1 Anfangen.

for(int k= 0;k <= 10; k++){ // k = einfach nur eine zahl
Was das bewirken soll weiß ich noch nicht so ganz.

Was du also machen solltest ist folgendes:

Java:
private int DIM = 8; // LÄNGE DES ARRAYS LT. INITIAL POST
for(int i = 1; i < DIM; i++)
{
    for(int j = 1; j < DIM; j++)
    {
          // Jetzt schaust du ob in deinem Eintrag eine Zahl steht:
          if(localMatrix[i][j].matches("[0-9]+"))
         {
              // jetzt schaust du, ob es eine Zeile drunter gibt
              if(i < DIM - 1)
             {
                   // jetzt schaust du was eine Zeile weiter drunter steht
                   if(localMatrix[i+1][j].equals(""))
                   {
                         // Wenn es frei ist, dann tausch die beiden Werte
                   }
              }
         }
    }
}

So versuch das erstmal umzusetzen.. hoffe meine Denkweise ist richtig und verständlich. Ist wie immer ungetestet.

Gruß
Robert
 
Kleines Update:
Code:
// Dreht inh[][] gegen den Urzeigersinn um 90°   
        public void Links(){
            String mm[][] = new String[this.dim+1][this.dim+1];
            for (int i = 1; i <= dim-1; i++){
                for (int j = 1; j <= dim-1; j++){
                    mm[i][j] = this.inh[j][dim-i];
                }
            }
            this.inh = mm;
        }

public void Fallen(){
for(int i= dim -1; i > 1;i--){
                for(int j = 1;j <= dim-1; j++){
                    String i1 = Integer.toString(i);
                    String st = String.valueOf(i1.charAt(j));
                    System.out.println("St : " +st);
                    System.out.println(dim +" " +i +" " +j +" " + this.inh[i][j]);
}
            }
            }
Ich habe jetzt herausgefunden, dass inh[][] nicht leer ist, d.h. dass man auch einen Wert ausgelesen bekommt(an der richtigen Stelle).
dim ist auch gegeben(weiß ich nur nich ganz wie, hat mir jemand geholfen, beim einlesen).
Jetzt kommt jedoch der Error, bei String st:
Code:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 2
    at java.lang.String.charAt(Unknown Source)
 
Ja ist ja klar. Nimm einfach mal den Fall dim = 5. Dann durchläuft i die Werte 4 ... 2 (sind alle einstellig !)
Dann machst du ein toString(i), d.h. eine einstellige Zahl. Dann versuchst du aber in der Schleife über j unweigerlich auf das 2. te Element charAt(j) zuzugreifen. Das geht dann aber in die Hose weil der String nicht so viele Elemente hat.
 

Neue Themen


Zurück
Oben