2015-03-16 1 views
1

J'ai un objet et je peux créer avec deux constructeursCréation d'objet et la lecture du fichier

public Brick(int x, int y){ 
    .......... 
} 

et

public Brick(int x, int y, float sizeX, float sizeY){ 

} 

Dans mon map.txt j'ai cette

Brick 320 0 
Brick 640 64 64 128 
Spike 5 12 
Spike 75 25 
... 
... 
... 

et voici comment j'ai lu ce fichier

 FileHandle file = Gdx.files.internal("data/map.txt"); 
     StringTokenizer tokens = new StringTokenizer(file.readString()); 
     while(tokens.hasMoreTokens()){ 
      String type = tokens.nextToken(); 
      if(type.equals("Block")){ 
       list.add(new Brick(Integer.parseInt(tokens.nextToken()), Integer.parseInt(tokens.nextToken()), Float.parseFloat(tokens.nextToken()), Float.parseFloat(tokens.nextToken()))); 
      } 

alors j'ai besoin de lire mon fichier que mes deux constructeurs fonctionneraient?

+0

Désolé, c'est juste une déclaration avec un point d'interrogation clouée sur la fin. J'ai de la difficulté à comprendre le problème. Quel est le problème réel que vous essayez de poser? – tnw

+0

Comme vous pouvez le voir maintenant quand je lis à partir d'un fichier txt j'appelle le second constructeur (avec 4 arguments) mais parfois j'ai besoin de créer des briques avec seulement 2 arguments. Alors est-il possible de lire correctement à partir du fichier txt? Fondamentalement, j'ai besoin de lire la ligne alors qu'il y a des chiffres – David

Répondre

1

Si chaque ligne a une commande alors je lirais ligne par ligne comme celui-ci:

import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.nio.charset.Charset; 
import java.util.StringTokenizer; 

public class readFile { 

    public static class Brick{ 
     public Brick(int a,int b){System.out.println("constructor for 2 params: "+a+", "+b);} 
     public Brick(int a,int b,int c,int d){System.out.println("constructor for 4 params: "+a+", "+b+", "+c+", "+d);} 
    } 

    public static void main(String[] args) throws Exception { 
     String line; 

     InputStream fis = new FileInputStream("map.txt"); 
     InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8")); 
     BufferedReader br = new BufferedReader(isr); 

     while ((line = br.readLine()) != null) { 
      //System.out.println(line); 
      StringTokenizer tokens = new StringTokenizer(line.trim()); 
      while(tokens.hasMoreTokens()){ 
       String type = tokens.nextToken(); 
       if(type.equals("Brick")){ 
        int params = tokens.countTokens(); 
        switch(params){ 
         case 2: new Brick(Integer.parseInt(tokens.nextToken()), 
              Integer.parseInt(tokens.nextToken())); 
          break; 
         case 4: new Brick(Integer.parseInt(tokens.nextToken()), 
              Integer.parseInt(tokens.nextToken()), 
              Integer.parseInt(tokens.nextToken()), 
              Integer.parseInt(tokens.nextToken())); 
          break; 
         default: throw new Exception("Wrong line:"+line); 
        }; 
       } 
      } 
     } 
    } 
} 
+0

Merci, mais peut-être qu'il est possible de compter les arguments dans une ligne? Je pense que cela résoudrait mon problème. – David

+1

tokens.countTokens(); compte les arguments en ligne (notez qu'il doit être appelé avant nextToken(), sinon chaque appel nextToken() soustrait 1) –