【问题标题】:Why java Scanner is not reading all the lines?为什么 java Scanner 没有读取所有行?
【发布时间】:2015-06-03 09:25:05
【问题描述】:

这是我的代码,它只是从输入流中读取行并显示它们,但令我惊讶的是它没有读取所有行。它的读数只到倒数第二行。

这是我的代码:-

import java.util.*;

public class Solution {

public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    short n = scan.nextShort();
    short m = scan.nextShort();
    byte[][] topics = new byte[n][m];
    for(short i = 0; i < n; i++){
        char[] arr = scan.nextLine().toCharArray();
        display(arr);

    }
}

private static void display(char[] arr){
    for(int i = 0; i < arr.length; i++){
        System.out.print(arr[i]);
    }
    System.out.println();
  }
 }

输入以这种格式给出

  4 5
 10101
 11100
 11010
 00101

我的输出是这样的:-

 10101
 11100
 11010

它没有第三行。为什么?

【问题讨论】:

  • @TheLostMind 我只是复制粘贴了输出,所以你也可以看到输出。

标签: java java.util.scanner inputstream


【解决方案1】:

问题是 scan.nextLine() 只需将其删除并放入 scan.next() 如果您了解 nextLine 方法,这可能会有所帮助

公共字符串 nextLine() 将此扫描器前进到当前行并返回已跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。位置设置为下一行的开头。 由于此方法继续搜索输入以查找行分隔符,因此如果不存在行分隔符,它可能会缓冲所有搜索要跳过的行的输入。

public class Solution 
{

public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    short n = scan.nextShort();
    short m = scan.nextShort();
    short[][] topics = new short[n][m];
    for(short i = 0; i < n; i++){
        char[] arr = scan.next().toCharArray();
        display(arr);

    }
}

private static void display(char[] arr){
    for(int i = 0; i < arr.length; i++){
        System.out.print(arr[i]);
    }
    System.out.println();
  }
 }

【讨论】:

    【解决方案2】:

    问题是对nextLine() 的第一次调用是读取“5”结尾(读取m)和换行符之间的空“行”。

    就个人而言,我要么完全停止使用Scanner(转而使用BufferedReader)——有大量的问题有点像这样,但它的行为并不完全符合你的意愿——或者 只是nextLine()。无论哪种方式,基本上一次处理一行:

    • 阅读第一行
    • 在空间上拆分它并将两个子字符串解析为nm
    • 阅读接下来的n

    基本上,Scanner 是“面向令牌的”,而您的输入格式更“面向行”。

    如果您确实想使用Scanner.nextShort(),您可以随时阅读第一行(使用BufferedReaderScanner)并创建一个仅来自该字符串的扫描仪:

    String firstLine = ...;
    Scanner firstLineScanner = new Scanner(firstLine);
    short n = firstLineScanner.nextShort();
    short m = firstLineScanner.nextShort();
    ...
    

    【讨论】:

    • 感谢您详尽而准确的解释。所以你建议在这些我们必须从输入流中读取的问题中,我们应该更喜欢 BufferedReader 而不是 Scanner。
    • @JohnDoe:嗯,我通常更喜欢BufferedReader,因为它的 API 不太容易混淆。
    【解决方案3】:

    在 for 循环之前添加 scan.nextLine(),以读取第一行的末尾(包含“4 5”)。没有它,循环内第一次调用scan.nextLine() 会返回一个空字符串。

    【讨论】:

    • 只是对 scan.nextLine() 的空白调用。难道没有更好的方法来做到这一点。我的意思是应该有类似skip()的东西。
    • @TheLostMind 不,最后一行没有被读取,因为迭代次数由读取的第一个整数 - 4 控制,因此循环读取第一行的末尾,然后读取接下来的 3 行。
    • @JohnDoe 您可以替换对nextShort 的两次调用,其中一次调用nextLine,然后拆分结果字符串并从中提取整数。那么你就不需要对 nextLine 的额外调用了。
    • 但这类似于使用缓冲阅读器
    猜你喜欢
    • 2013-03-23
    • 2012-12-02
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2014-12-18
    • 2016-12-15
    相关资源
    最近更新 更多