Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么java扫描器没有读取所有行?_Java_Java.util.scanner_Inputstream - Fatal编程技术网

为什么java扫描器没有读取所有行?

为什么java扫描器没有读取所有行?,java,java.util.scanner,inputstream,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.nextShor

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

这是我的密码:-

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();
  }
 }
我的输出是:-

 10101
 11100
 11010

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

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

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

就我个人而言,我要么完全停止使用
Scanner
(支持
BufferedReader
)-有大量类似这样的问题,它的行为与您希望的不完全一样-要么只是
nextLine()
。无论哪种方式,基本上一次处理一行:

  • 读第一行
  • 在空间上拆分它,并将两个子字符串解析为
    n
    m
  • 阅读下一行
    n
基本上,
Scanner
是“面向令牌”的,而您的输入格式更为“面向行”

如果确实要使用
Scanner.nextShort()
,则始终可以读取第一行(使用
BufferedReader
Scanner
)并仅从该字符串创建新的扫描仪:

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

问题是scan.nextLine()只需删除此项并放置
scan.next()
如果您阅读了nextLine方法,这可能会有所帮助

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

公共类解决方案
{
公共静态void main(字符串[]args){
扫描仪扫描=新扫描仪(System.in);
short n=scan.nextShort();
short m=scan.nextShort();
short[][]主题=新的short[n][m];
对于(短i=0;i}
只需对scan.nextLine()进行一个空白调用。难道没有更好的办法吗。我的意思是应该有类似skip()的内容。@TheLostMind No,最后一行不被读取,因为迭代次数由第一个整数read-4控制,因此循环读取第一行的末尾,然后读取接下来的3行。@JohnDoe您可以替换对
nextShort
的两个调用,这是对
nextLine
的单个调用,然后拆分结果字符串并从中提取整数。这样您就不需要额外调用nextLine,但这类似于使用缓冲区Reader@TheLostMind我只是复制粘贴了输出,所以您也可以看到输出。感谢您的详细和精确的解释。所以你是说,在这样的问题中,我们必须从输入流中读取数据,我们应该更喜欢BufferedReader而不是Scanner。@JohnDoe:我通常更喜欢
BufferedReader
,因为它的API不太容易混淆。
String firstLine = ...;
Scanner firstLineScanner = new Scanner(firstLine);
short n = firstLineScanner.nextShort();
short m = firstLineScanner.nextShort();
...