Написание файла на Java - PullRequest
       1

Написание файла на Java

1 голос
/ 03 февраля 2011

Добрый день!

У меня есть проект (игра), который должен быть представлен завтра утром. Но я обнаружил ошибку при записи в высокие оценки. Я пытаюсь создать текстовый файл и написать ИМЯ СЧЕТА в порядке убывания, используя оценку в качестве основы.

НА ПРИМЕРЕ:

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

ЗАМЕТЬ ТАКЖЕ ТАКЖЕ Мой код выглядит следующим образом:

  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();
}

Но если я введу три числа: 60 ​​Мэнни, файл будет выглядеть так:

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

Проблема в том, что он может читать только 2 числа, потому что я использую sScores.substring(0, 2).trim()). Я попытался изменить его на sScores.substring(0, 3).trim()). но становится ошибкой, потому что он читает до символьной части. Может ли кто-нибудь помочь мне пересмотреть мой код, чтобы я мог прочитать до 4 цифр? Ваша помощь будет высоко оценена.

Ответы [ 3 ]

3 голосов
/ 03 февраля 2011

То, что вы должны использовать:

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

Тогда у вас будет массив с номером в индексе 0 и именем в индексе 1.

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

Вы можете переписать цикл while следующим образом:

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();
}

Лично я бы добавил новый класс HighScore для помощи в разборе файла.

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());
    }
}
2 голосов
/ 03 февраля 2011

Формат каждой строки всегда один и тот же: целое число, затем вкладка и имя игрока.

Просто найдите индекс символа табуляции в каждой строке и подстроку от 0 (включительно) до этого индекса (исключая), прежде чем анализировать счет.

Имя игрока можно получить, взяв подстроку из индекса вкладки +1 (включительно) по всей длине линии (исключая).

1 голос
/ 03 февраля 2011

, если вышеупомянутая таблица является файлом.

для первых двух оценок это будет хорошо, но для 5 начнется чтение символа.Может быть, это вызывает проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...