我正在尝试设置一个高分系统来对文件中的分数进行排序,并从数字中分离出名称。但是当我尝试使用readline两次时,由于另一种readline方法,它会跳过1行。有人可以帮助我,这是为了学校!
文件示例:
kevin:50 dustin:31 nobody:71 imax:23
这是代码:
public class Main {
public static void main(String[] args) {
ArrayList<Integer> result = new ArrayList<>();
String name="";
try (BufferedReader br= new BufferedReader(new FileReader("res/highscore.txt"))){
while (br.ready()){
result.add(Integer.parseInt(br.readLine().split(":")[1]));
name = br.readLine().split(";")[0];
System.out.println(name);
}
Collections.sort(result);
Collections.reverse(result);
for (Integer integer : result) {
System.out.println(integer);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
关于@thewho69的答案的一些解释。
你已陷入副作用的陷阱。方法不仅可以直观地表达其名称。在此示例中,readLine()
方法不仅读取即将到来的行,还将光标位置设置为下一行的开头。
这使得readLine
方法不是幂等的,这意味着使用相同的参数(在这种情况下为none)调用该方法两次不一定会返回相同的输出。
为了不陷入这个陷阱,你必须找到一种方法来多次使用当前的一行,同时只调用一次br.readLine()
方法 - 因此在迭代中只设置一次光标位置,这在这种情况下是可取的。这个问题的一个很好的解决方案是@ thewho69在20分钟之前提出的建议。
只需将每一行存储在一个变量中:
public class Main {
public static void main(String[] args) {
ArrayList<Integer> result = new ArrayList<>();
String name="";
try (BufferedReader br= new BufferedReader(new FileReader("res/highscore.txt"))){
String line;
while ((line = br.readLine()) != null){
result.add(Integer.parseInt(line.split(":")[1]));
name = line.split(";")[0];
System.out.println(name);
}
Collections.sort(result);
Collections.reverse(result);
for (Integer integer : result) {
System.out.println(integer);
}
} catch (IOException e) {
e.printStackTrace();
}
}