Java-如何执行读取方法而又不因其他readline方法而跳过一行

时间:2019-03-10 23:57:35

标签: java java.util.scanner bufferedreader

我正在尝试建立一个高分系统,以对文件中的分数进行排序,并将名称与数字分开。但是当我尝试两次使用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();
    }
}

}

2 个答案:

答案 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();
    }
}