为什么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();
...