这是我的代码,它只是从输入流中读取行并显示它们,但令我惊讶的是它没有读取所有行。它只能读到最后一行。
这是我的代码: -
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
它没有第三条线。为什么呢?
答案 0 :(得分:2)
在for循环之前添加scan.nextLine()
,以读取第一行的末尾(包含“4 5”)。没有它,循环内第一次调用scan.nextLine()
会返回一个空字符串。
答案 1 :(得分:1)
问题在于,对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();
...
答案 2 :(得分:0)
问题是 scan.nextLine()
只需将其删除即可
scan.next()
如果您阅读了nextLine方法,这可能会有所帮助
public String 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();
}
}
&#13;