Я создал игру по угадыванию слов, но не могу определить победителя.
Я создаю файл 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();
}*/




Вы можете сделать это так, используя 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());
если есть два победителя, как я могу включить это в код?