Java - 由于其他readline方法,如何在不跳过一行的情况下执行读取方法

问题描述 投票:0回答:2

我正在尝试设置一个高分系统来对文件中的分数进行排序,并从数字中分离出名称。但是当我尝试使用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();
    }
}

}

java java.util.scanner bufferedreader
2个回答
2
投票

关于@thewho69的答案的一些解释。

你已陷入副作用的陷阱。方法不仅可以直观地表达其名称。在此示例中,readLine()方法不仅读取即将到来的行,还将光标位置设置为下一行的开头。

这使得readLine方法不是幂等的,这意味着使用相同的参数(在这种情况下为none)调用该方法两次不一定会返回相同的输出。

为了不陷入这个陷阱,你必须找到一种方法来多次使用当前的一行,同时只调用一次br.readLine()方法 - 因此在迭代中只设置一次光标位置,这在这种情况下是可取的。这个问题的一个很好的解决方案是@ thewho69在20分钟之前提出的建议。


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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.