Denkfehler in kA

DanielsLPecke

Mitglied
Ich kapier nicht ganz was ich falsch gemacht habe...

Also meine Datei ist so Formatiert:

Code:
-MAPFILE-
6:6;
1:1:1:19:1:1;
2:2:27:2:2:2;
3:3:3:36:3:3;
4:4:4:4:4:4;
5:5:5:5:53:5;
5:15:5:5:5:5;

Der Codeschnipsel unten bekomment nur Das "Feld" also nicht das 6:6; und -MAPFILE-
So der Plan ist es das ich gucke ob der Charakter ':' ist wenn nicht dann soll der Integer steigen siehe:
Java:
while(msg.charAt(Char)!=':'){
    Char++;
    System.out.println(Char);
}
So und dann bekomme ich einen Substring undzwar von
Java:
values[reihe][spalte] = Integer.parseInt(msg.substring(Char-1,Char));

Ihr wisst schon worauf ich hinaus bin...
//EDIT
Das WIDTH und HEIGHT zeigen nur die größe des Feldes an also 6:6;
//EDIT2
:oops:Ich sollte mein Problem schon reinschreiben -.-
So es wird immer nur das erste vom Feld genommen also das Char

also so:

1:2:3:4:5:6;

Endergebnis = 1 1 1 1 1 1
also value[0 Bis 5 ][0]

Java:
            int reihe = 0,Char=0;
            int spalte = 0;
            int[][] values = new int[WIDTH][HEIGHT];
                 
            try {
                msg=br.readLine();
            } catch (IOException e) {e.printStackTrace();}
        
            while(reihe<=WIDTH-1){
                if(spalte==-2147483648){
                    break;
                }
                while(spalte<=HEIGHT-1){
                    if(reihe==WIDTH){
                        reihe=0;
                        break;
                    }                
                    while(msg.charAt(Char)!=':'){
                        Char++;
                        System.out.println(Char);
                    }                
                    System.out.println("Reihe: "+reihe+ " Spalte: "+spalte+" Char: "+Char);
                    values[reihe][spalte] = Integer.parseInt(msg.substring(Char-1,Char));

                    reihe++;
                }spalte++;
            }
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
Naja du hast den Code ja auch so geschrieben ;)

Java:
while(msg.charAt(Char)!=':'){
                        Char++;

Du kontrollierst hier ob das Zeichen an der Stelle "Char" ungleich ":" ist.
Da du beim Char=0 anfängst wird das allerste Zeichen im String abgefragt. Da dies immer eine Zahl ist wird die Schleife betreten und Char erhöht (von 0 auf 1).
Danach gibst du Char (welches jetzt den Wert 1 hat) aus und prüfst weiter welches Zeichen an Char=1 steht. Bei deinem Beispiel file steht immer ":" an 2.Stelle.
Somit wird die Schleife verlassen und der weitere Code ausgeführt.


Ansonsten kann man hier wie Thallius schon sagt das ganze einfacher mit "split" erreichen.
Außerdem fängst du bei "br.readLine()" zwar eine Exception ab aber sollte "msg" null zugewiesen werden dann fliegt dir spätestens bei der innersten "while"-Schleife eine NullPointerException um die Ohren.
 

DanielsLPecke

Mitglied
Also ich habe jetzt hier das eingefügt:
Java:
if(msg!=null){
/*
CODE
*/
}
Von dieser String.split();
Sache habe ich noch nie gehört! Danke für den Tipp!
 
Zuletzt bearbeitet:

DanielsLPecke

Mitglied
Soo das hier habe ich benutzt um das zu lesen geht auch super!
Nur ich weiß nicht wie man das ; weg bekommt!
Der Output sieht so aus:
Code:
1
1
1
1
1
1;
2
2
2
2
2
2;
3
3
3
3
3
3;
4
4
4
4
4
4;
5
5
5
5
5
5;
5
15
5
5
5
5;
FEHLER!
Es gibt keine Neue Zeile mehr!
Java:
    int i = 0;
            int imax = WIDTH;
            int s = 0;
            int smax = HEIGHT;
           
            while(s<smax){
                i=0;
               
                while(i<imax){
                       
                        //if(!parts[i].contains(";")){
                            String[] parts = msg.split(":");
                            System.out.println(parts[i]);
                           
                    //    }
                        i++;
                }
               
                try {
                   
                    if((msg = br.readLine())== null){
                        System.out.println("FEHLER!\n"
                                         + "Es gibt keine Neue Zeile mehr!");
                        System.exit(1);
                    }
                   
                } catch (IOException e) {e.printStackTrace();}
                   
            s++;
            }
 

Joose

Top Contributor
Deine 2.while-Schleife ist nicht notwendig!
Du gehst Zeile für Zeile durch und jede Zeile wird von dir gesplittet. Sprich mit 1x split hast du schon dein Ziel-Array mit den Werten. So macht dein aktuell 6x den gleichen split, einziger Unterschied jedesmal wird ein anderer Wert vom Ergebnis ausgegeben.

Nur ich weiß nicht wie man das ; weg bekommt!

Schau doch einfach mal in der Doku nach: String bietet hier Methoden wie "substring()" oder aber auch "replace()" an.
Mit "substring()" kannst du dir einen Teil des Strings herausschneiden, mit "replace" kannst du einzelne Zeichen oder auch ganze Ausdrücke (RegEx) ersetzen.
 

DanielsLPecke

Mitglied
Naja egal ich habs jetzt danke!
Der ganze Code für leute die sich das mal hier anschauen!
Der ist übrigens um Maps zu laden ;D
Code:
-MAPFILE-
6:6;
1:2:3:4:5:6;
1:2:3:4:5:6;
1:2:3:4:5:6;
1:2:3:4:5:6;
1:2:3:4:5:6;
1:2:3:4:5:6;
Das ist die level1.mapfile
Erste Zeile ist um anzugeben das es sich um ein Mapfile handelt
Die Zweite ist dafür um zu zeigen wie groß die Map ist also Breite:Höhe;
Der Rest ist die Map.. Also 1:2:3:4; Die Doppelpunkte trennen die Zahlen von einander. Das Semikolon ist dafür da um die Reihe zu schließen so wie in Java.

Das ergebnis wird in dem Array parts[] gespeichert
Um Integer zahlen zu bekommen müsst ihr das schreiben:

Java:
    ergebnis = new int[WIDTH];
                                      
                                        while(parts[i]!=null){
                                            ergebnis[i] = Integer.parseInt(parts[i]);
                                        }

Java:
package daniel.com;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Main {
  
    static String weg = "maps/level1.mapfile";
    private static int WIDTH;
    private static int HEIGHT;
    static String msg;
 
    Main(String pfad){
        weg = pfad;
    }
 
    public static void main(String[] args) {
      
    FileReader fr = null;
    msg = null;
    File maps = new File("maps/");
    File level1 = new File("maps/level1.mapfile");
 
    if(!maps.exists()){
        maps.mkdirs();
    }
    if(!level1.exists()){
        try{
            level1.createNewFile();
        }catch(IOException e){
            e.printStackTrace();
        }
    }
    try {
        fr = new FileReader(weg);
    } catch (FileNotFoundException e) {e.printStackTrace();}
 
    BufferedReader br = new BufferedReader(fr);
 
    try {
        msg = br.readLine();
    } catch (IOException e) {e.printStackTrace();}
 
    if(msg != null && msg.contains("-MAPFILE-")){
        System.out.println("MapFile bestätigt!");
     
        try {
            msg = br.readLine();
        } catch (IOException e) {e.printStackTrace();}
        if(msg!=null){
            //  |
            //: V gefunden
            boolean notFound = true;
            //  |
            //; V gefunden
            boolean notFound2 = true;
            int widthI = 0;
            int heightI;
         
            while(notFound){
                if(msg.charAt(widthI) == ':'){
                    notFound = false;
                    System.out.println("\nSUCCESS!"
                                     + "\nEin ':' wurde gefunden in der Mapfile!");
                }
                widthI++;
            }
         
            WIDTH = Integer.parseInt(msg.substring(0, widthI-1));
            heightI = widthI;
            while(notFound2){
                if(msg.charAt(heightI) == ';'){
                    notFound2 = false;
                    System.out.println("\nSUCCESS!"
                                     + "\nEin ';' wurde gefunden in der Mapfile!");
                }
                heightI++;
            }
            HEIGHT = Integer.parseInt(msg.substring(widthI, heightI-1));
            System.out.println("\n"+WIDTH+" "+HEIGHT);
          
            int reihe = 0,Char=0;
            int spalte = 0;
            int count =0;
            int[][] values = new int[WIDTH][HEIGHT];
          
            try {
                msg=br.readLine();
             
            } catch (IOException e) {e.printStackTrace();}
          
            int i = 0;
            int imax = WIDTH;
            int s = 0;
            int smax = HEIGHT;
         
                        while(s<smax){
                            i=0;
                            while(i<imax){
                                        String[] parts = msg.split(":");
                                        if(parts[i].contains(";")){
                                            parts[i] = parts[i].substring(0,1);
                                        }
                                    i++;
                            }
                            try {
                                if((msg = br.readLine())== null){
                                    System.out.println("\nMap Ende Erreicht\n"
                                                     +   "Die Map wurde somit erfolgreich geladen");
                                    System.exit(1);
                                }
                            } catch (IOException e) {e.printStackTrace();}
                        s++;
                        }
        }else{
            System.out.println("\nFEHLER!"
                     + "\nDie MapDatei ist nicht vollständig!");
        }
    }else{
        System.out.println(
                   "\nFEHLER!"
                +  "\nDiese Datei ist keine Mapfile!");
    }
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Ähnliche Java Themen

Neue Themen


Oben