Я создал игру по угадыванию слов, но мне не удается определить победителя.

Я создаю файл result.txt, содержащий "попытки слов для имени"

Затем я читаю этот файл и пытаюсь определить человека с наименьшими попытками.

Так например

Mike Keyboard 4
John Monitor 2

Я хочу отобразить Джона победителем с 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();
    }*/
0
comp 15 Ноя 2018 в 06:10

1 ответ

Лучший ответ

Вы можете сделать это так, используя 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());
0
Ravindra Ranwala 17 Ноя 2018 в 09:26