我正在尝试建立一个高分系统,以对文件中的分数进行排序,并将名称与数字分开。但是当我尝试两次使用readline时,由于其他readline方法,它会跳过1行。有人可以帮我吗,这是在学校!
文件示例:
凯文:50尘土:31没有人: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();
}
}
}
答案 0 :(得分:2)
有关@ thewho69答案的一些解释。
您陷入了副作用陷阱。一种方法不仅可以做到其名称所直观暗示的功能。在此示例中,readLine()
方法不仅读取下一行,还将光标位置设置到下一行的开头。
这使得readLine
方法不是幂等的,这意味着使用相同参数(在这种情况下,没有参数)两次调用该方法不一定会返回相同的输出。
为了不陷入此陷阱,您必须找到一种方法来多次使用当前一行,同时仅调用一次br.readLine()
方法-因此在一次迭代中仅设置一次光标位置,在这种情况下,这是理想的。一个很好的解决方案是@ thewho69在20分钟前提出的建议。
答案 1 :(得分:1)
只需将每行存储在一个变量中:
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();
}
}