为什么java Scanner没有读取所有行?

时间:2015-03-30 11:22:55

标签: java java.util.scanner inputstream

这是我的代码,它只是从输入流中读取行并显示它们,但令我惊讶的是它没有读取所有行。它只能读到最后一行。

这是我的代码: -

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

它没有第三条线。为什么呢?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

问题在于,对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();
...

答案 2 :(得分:0)

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

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

&#13;
&#13;
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();
  }
 }
&#13;
&#13;
&#13;