从标准输入读取一行的缓冲读取器 readLine()

6

我需要从标准输入中读取数据。我对BufferedReader不是很熟悉,目前只用过Scanner。Scanner(或者可能是我的代码内部问题)一直给我返回TLE错误。现在的问题是,BufferedReader似乎跳过了一些行,我一直收到NumberFormatException。

这是我的代码:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    int cases = Integer.parseInt(reader.readLine());

    for(int i = 0; i < cases && cases <= 10; i++) {
        int numLines = Integer.parseInt(reader.readLine());
        String[] lines = new String[numLines + 1];
        HashSet<String> pat = new HashSet<String>();

        for(int j = 0; j < numLines && j <= 10; j++) {
            String l = reader.readLine();

            String patternStr = "\\W+";
            String replaceStr = "";

            Pattern pattern = Pattern.compile(patternStr);
            Matcher matcher = pattern.matcher(l.toString());

            String m = matcher.replaceAll(replaceStr);

            lines[j] = m;
            getPatterns(m, pat);

            System.out.println(m);
        }

第二次输入后发生了错误,请帮忙解决。

为什么你要使用 BufferedReader 而不是 Scanner? - Rohit Jain
当您将其解析为整数时,使用reader.readLine().trim() - Nikolay Kuznetsov
通常情况下,您需要在循环中从BufferedReader读取,直到出现null - Nikolay Kuznetsov
1
@RohitJain BufferedReaderScanner更快。来自官方文档:"如果没有缓冲,每次调用read()或readLine()都可能导致从文件中读取字节,转换为字符,然后返回,这可能非常低效。" - xdavidliu
1个回答

6

BufferedReader#readLine() 方法在读取行末的换行符时会忽略它。因此,当您连续调用两次 readLine() 时,第一个会读取您的输入,而第二个则会读取第一个留下的 newline

这就是为什么它跳过了您提供的输入。

您可以使用 BufferedReader#skip()for loop 中的每个 readLine 后跳过换行符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接