为什么 java 扫描仪没有读取所有行?
Why java Scanner is not reading all the lines?
这是我的代码,它只从输入流中读取行并显示它们,但令我惊讶的是它没有读取所有行。它只读到倒数第二行。
这是我的代码:-
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
它没有第三行。为什么?
在 for 循环之前添加一个 scan.nextLine()
,以读取第一行的末尾(包含“4 5”)。没有它,第一次调用 scan.nextLine()
在循环 returns 一个空字符串。
问题是对 nextLine()
的第一次调用正在读取“5”结尾(读取 m
)和换行符之间的空白 "line"。
就个人而言,我要么完全停止使用 Scanner
(转而使用 BufferedReader
)- 有很多问题有点像这样,但它的表现并不完全符合您的意愿- 或者 仅 仅 nextLine()
。无论哪种方式,基本上一次处理一行:
- 阅读第一行
- 将其拆分为 space 并将两个子字符串解析为
n
和 m
- 阅读接下来的
n
行
基本上,Scanner
是 "token-oriented",而您的输入格式更 "line-oriented"。
如果您 想使用 Scanner.nextShort()
,您总是可以阅读第一行(使用 BufferedReader
或 Scanner
)并从该字符串创建一个 new 扫描器:
String firstLine = ...;
Scanner firstLineScanner = new Scanner(firstLine);
short n = firstLineScanner.nextShort();
short m = firstLineScanner.nextShort();
...
问题是scan.nextLine()
把这个去掉然后放
scan.next()
如果您了解 nextLine 方法,这可能会有所帮助
public 字符串 nextLine()
将此扫描器推进到当前行和 returns 跳过的输入之后。此方法 returns 当前行的其余部分,不包括末尾的任何行分隔符。该位置设置为下一行的开头。
由于此方法继续在输入中搜索行分隔符,因此如果不存在行分隔符,它可能会缓冲搜索要跳过的行的所有输入。
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();
}
}
这是我的代码,它只从输入流中读取行并显示它们,但令我惊讶的是它没有读取所有行。它只读到倒数第二行。
这是我的代码:-
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
它没有第三行。为什么?
在 for 循环之前添加一个 scan.nextLine()
,以读取第一行的末尾(包含“4 5”)。没有它,第一次调用 scan.nextLine()
在循环 returns 一个空字符串。
问题是对 nextLine()
的第一次调用正在读取“5”结尾(读取 m
)和换行符之间的空白 "line"。
就个人而言,我要么完全停止使用 Scanner
(转而使用 BufferedReader
)- 有很多问题有点像这样,但它的表现并不完全符合您的意愿- 或者 仅 仅 nextLine()
。无论哪种方式,基本上一次处理一行:
- 阅读第一行
- 将其拆分为 space 并将两个子字符串解析为
n
和m
- 阅读接下来的
n
行
基本上,Scanner
是 "token-oriented",而您的输入格式更 "line-oriented"。
如果您 想使用 Scanner.nextShort()
,您总是可以阅读第一行(使用 BufferedReader
或 Scanner
)并从该字符串创建一个 new 扫描器:
String firstLine = ...;
Scanner firstLineScanner = new Scanner(firstLine);
short n = firstLineScanner.nextShort();
short m = firstLineScanner.nextShort();
...
问题是scan.nextLine()
把这个去掉然后放
scan.next()
如果您了解 nextLine 方法,这可能会有所帮助
public 字符串 nextLine() 将此扫描器推进到当前行和 returns 跳过的输入之后。此方法 returns 当前行的其余部分,不包括末尾的任何行分隔符。该位置设置为下一行的开头。 由于此方法继续在输入中搜索行分隔符,因此如果不存在行分隔符,它可能会缓冲搜索要跳过的行的所有输入。
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();
}
}