我已经创建了猜词游戏,但是在显示获胜者时遇到了麻烦。
我正在创建一个包含“名称单词尝试”的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();
}*/
答案 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());