2011-02-03 7 views
1

Bonne journée!Écrire un fichier en Java

J'ai un projet (jeu) qui doit être présenté demain matin. Mais j'ai découvert un bug en écrivant dans les meilleurs scores. J'essaie de créer un fichier texte et d'écrire le nom du SCORE dans l'ordre décroissant en utilisant le score comme base.

PAR EXEMPLE:

SCORE NAME   RANK 
230  God 
111  Galaxian  
10  Gorilla 
5  Monkey 
5  Monkey 
5  Monkey 

NOTE Il y a aussi un RANG Mon code est le suivant:

public void addHighScore() throws IOException{ 
     boolean inserted=false; 

     File fScores=new File("highscores.txt"); 
     fScores.createNewFile(); 

     BufferedReader brScores=new BufferedReader(new FileReader(fScores)); 
     ArrayList vScores=new ArrayList(); 
     String sScores=brScores.readLine(); 
     while (sScores!=null){ 
       if (Integer.parseInt(sScores.substring(0, 2).trim()) < score &&  inserted==false){ 
         vScores.add(score+"\t"+player+"\t"+rank); 
         inserted=true; 
       } 
       vScores.add(sScores); 
       sScores=brScores.readLine(); 
     } 
     if (inserted==false){ 
       vScores.add(score+"\t"+player+"\t"+rank); 
       inserted=true; 
     } 
     brScores.close(); 

     BufferedWriter bwScores=new BufferedWriter(new FileWriter(fScores)); 
     for (int i=0; i<vScores.size(); i++){ 
       bwScores.write((String)vScores.get(i), 0, ((String)vScores.get(i)).length()); 
       bwScores.newLine(); 
     } 
     bwScores.flush(); 
     bwScores.close(); 
} 

Mais si je saisis les trois chiffres: 60 Manny, le fichier serait comme ceci:

60  Manny 
    230  God 
    111  Galaxian  
    10  Gorilla 
    5  Monkey 
    5  Monkey 
    5  Monkey 

Le problème est qu'il peut seulement lire 2 nombres parce que j'utilise sScores.substring(0, 2).trim()). J'ai essayé de le changer en sScores.substring(0, 3).trim()). mais devient une erreur car il a lu jusqu'à la partie du personnage. Quelqu'un peut-il m'aider à réviser mon code afin que je puisse lire jusqu'à 4 chiffres? Votre aide sera très appréciée.

Répondre

3

Ce que vous devez utiliser est:

String[] parts = sScrores.trim().split("\\s+", 2); 

Ensuite, vous aurez un tableau avec le nombre à l'index 0, et le nom dans l'index 1.

int theNumber = Integer.parseInt(parts[0].trim(); 
String theName = parts[1].trim(); 

Vous pouvez ré-écrire le while comme ceci:

String sScores=brScores.readLine().trim(); 
while (sScores!=null){ 
     String[] parts = sScrores.trim().split(" +"); 
     int theNumber = Integer.parseInt(parts[0].trim(); 
     if (theNumber < score &&  inserted==false){ 
       vScores.add(score+"\t"+player+"\t"+rank); 
       inserted=true; 
     } 
     vScores.add(sScores); 
     sScores=brScores.readLine(); 
} 

Personnellement, je voudrais ajouter une nouvelle classe HighScore pour aider à l'analyse syntaxique le fichier.

class HighScore { 

    public final int score; 
    public final String name; 
    private HighScore(int scoreP, int nameP) { 
     score = scoreP; 
     name = nameP; 
    } 

    public String toString() { 
     return score + " " + name; 
    } 

    public static HighScore fromLine(String line) { 
     String[] parts = line.split(" +"); 
     return new HighScore(Integer.parseInt(parts[0].trim()), parts[1].trim()); 
    } 
} 
+0

A écrit la même chose: P – jjczopek

+0

@jjc, tu avais raison. – jjnguy

+0

faire que '.split (" + ")' –

2

Le format de chaque ligne est toujours le même: un entier, suivi d'un onglet, suivi du nom du joueur. Il suffit de trouver l'index du caractère de tabulation dans chaque ligne, et la sous-chaîne de 0 (inclusivement) à cet index (exclusif), avant d'analyser le score.

Le nom du joueur peut être obtenu en prenant la sous-chaîne de l'indice de tabulation +1 (inclus) jusqu'à la longueur de la ligne (exclusif).

+0

C'est aussi une bonne solution. – jjnguy

+0

Dieu, j'ai tellement à apprendre! Merci. :) – newbie

1

si la table mentionnée ci-dessus est un fichier. Pour les deux premiers résultats, il sera correct, mais pour 5, il commence à lire le caractère. Peut-être que cela cause un problème.

+0

merci aussi :) – newbie

Questions connexes