Получение результатов из файла - PullRequest
0 голосов
/ 15 ноября 2018

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

Я создаю файл 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();
    }*/

1 Ответ

0 голосов
/ 15 ноября 2018

Вы можете сделать это так, используя 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...