0

入力ファイル/ハイスコアをソートするのに助けが必要ですホルダーコンパレーター、Collections.Sortを試しましたが、今は配列リストにしようとしているので、ハイスコアは試行したが失敗した時間でソートされます。数日間。アニーの提案は素敵だろう

import java.io.*;
import java.util.*;

public class game {

private static void  start() throws IOException {
    int number = (int) (Math.random() * 1001);
    BufferedReader reader;
    reader = new BufferedReader(new InputStreamReader(System.in));
    Scanner input = new Scanner(System.in);

    String scorefile = "p-lista_java";
    int försök = 0;
    int gissning = 0;
    String namn;
    String line = null;
    String y;
    String n;
    String val ;
    String quit = "quit";
    String Gissning;

    System.out.println("Hello and welcome to this guessing game" +
            "\nStart guessing it's a number between 1 and 1000: ");

    long startTime = System.currentTimeMillis();
    while (true || (!( input.next().equals(quit)))){   


        System.out.print("\nEnter your guess: ");
        gissning = input.nextInt();
        försök++;

        if (gissning == number ){
            long endTime = System.currentTimeMillis();
            long gameTime = endTime - startTime;
            System.out.println("Yes, the number is " + number + 
                    "\nYou got it after " + försök + " guesses " + " times in " + (int)(gameTime/1000) + " seconds.");
            System.out.print("Please enter your name: ");
            namn = reader.readLine();


            try {
                BufferedWriter outfile
                        = new BufferedWriter(new FileWriter(scorefile, true));
                outfile.write(namn + " " + försök +"\t" + (int)(gameTime/1000) + "\n");
                outfile.close();
            } catch (IOException exception) {

            }
         break;

        }

         if( gissning < 1 || gissning > 1000 ){
                System.out.println("Stupid guess! I wont count that..." );
                --försök;
         }

         else if (gissning > number){
            System.out.println(" Your guess is too high");
         }
        else 
            System.out.println("Your guess is too low");
    }

        try {
            BufferedReader infile
                        = new BufferedReader(new FileReader(scorefile));
            while ((line = infile.readLine()) != null) {
                System.out.println(line);
            }
            infile.close();

        } catch (IOException exception) {

    }

    System.out.println("Do you want to continue (Y/N)?");
       val=reader.readLine();

       if ((val.equals("y"))||(val.equals("Y"))){
           game.start();
       }
       else 
           System.out.print("Thanks for playing");
       System.exit(0);

}


    public static void main (String[] args) throws IOException {

       game.start();
    }
}
4

1 に答える 1

0

これを達成するには多くの方法があります。おそらく最も簡単な方法は、スコアを画面に出力する前にソートすることです。まず、スコアラインをリストに入れます。

BufferedReader infile = new BufferedReader(new FileReader(scorefile));
List<String> scores = new ArrayList<String>();
while ((line = infile.readLine()) != null) {
    scores.add(line);
}
infile.close();

これで、リストを並べ替えることができます。sortクラスのメソッドを使用できますが、これCollectionsにはカスタムを使用する必要がありますComparator<name>\t<steps>\t<time>ハイスコ​​アは空白の行と同じようにフォーマットさsplitれているため、3 番目の要素を数値として解析し、それらの数値を比較します。

Collections.sort(scores, new Comparator<String>() {
    public int compare(String s1, String s2) {
        int t1 = Integer.parseInt(s1.split("\\s")[2]); // time in s1
        int t2 = Integer.parseInt(s2.split("\\s")[2]); // time in s2
        return t1 - t2;                                // neg. if t1 < t2
    } 
});

scoresこれにより、インプレースのリストがソートされるため、あとはスコアを実際に印刷するだけです。

System.out.println("Name       Steps  Time");
for (String s : scores) {
    String[] ps = s.split("\\s");
    System.out.println(String.format("%-10s %5s %5s", ps[0], ps[1], ps[2]));
}
于 2012-09-19T21:28:57.987 に答える