从文件获取分数

时间:2018-11-15 03:10:05

标签: java file

我已经创建了猜词游戏,但是在显示获胜者时遇到了麻烦。

我正在创建一个包含“名称单词尝试”的result.txt文件

然后我正在读取该文件,并试图确定尝试次数最少的人。

例如

Mike Keyboard 4
John Monitor 2

我想两次尝试将约翰展示为获胜者。

我尝试过的一些代码

     String user = null;
     int min = 0;
     int attempts=0;
     ArrayList<String> players = new ArrayList<>();
     File file = new File("result.txt");

    try (Scanner scan = new Scanner(new File("result.txt"))) {
       while(scan.hasNext()){
         players.add(scan.nextLine());
       }  
       System.out.println(players);
    }

我知道这行不通,但是我也尝试过类似的事情。

     //System.out.println("------------Player List------------");
     /* try {
        Scanner in = new Scanner(new File("result.txt"));
        while(in.hasNext()){
           user = in.next();
           String word = in.next();
           System.out.println(user + " ");
            while (in.hasNextInt())
            {
            attempts = in.nextInt();
            }
            min = Math.min(attempts,min);
            System.out.println("User: "+user+" has " + attempts+ " attempts.");

        attempts = 0;
        }
        in.close();
    }
    catch(IOException ex) {
        ex.printStackTrace();
    }*/

1 个答案:

答案 0 :(得分:0)

您可以使用Java8来做到这一点,

Path path = Paths.get("src/main/resources", "data.txt");
try (Stream<String> lines = Files.lines(path)) {
    String[] winner = lines.map(l -> l.split(" "))
            .reduce((a1, a2) -> Integer.valueOf(a1[2]) < Integer.valueOf(a2[2]) ? a1 : a2)
            .orElseThrow(IllegalArgumentException::new);
    System.out.println(Arrays.toString(winner));
}

读取文件的每一行,将其拆分为一个数组,然后根据尝试次数进行归约,使尝试次数最少。然后从结果中提取所需的内容。

如果您有多个获胜者并希望获得所有获胜者,则减少步骤将不起作用。您可能需要将它们收集到TreeMap中,其中关键是分数,值是具有该分数的玩家的名字。然后获得第一个条目,因为那是得分最低的条目。这是代码。

TreeMap<Integer, List<String>> winners = lines.map(l -> l.split(" "))
    .collect(Collectors.groupingBy(a -> Integer.valueOf(a[2]), TreeMap::new, 
        Collectors.mapping(a -> a[0], Collectors.toList())));
System.out.println(winners.firstEntry());