Java中读取含空格输入的方法及二维数组输入忽略空格问题排查
问题分析与解决方案
咱们来一步步拆解你的问题哈~首先你的代码出现异常的核心原因,是**Scanner.nextInt()的工作机制**:它会自动跳过所有空白字符(包括空格、换行、制表符),只提取整数内容。不管你输入时用空格还是换行分隔数字,它都只会按整数个数来读取,完全忽略空白的类型——这就是为什么程序会持续等待输入(它要凑够n*m个整数才会停止),而且没法识别空行/空输入(对应你想要的空数组元素)。
解决思路
要实现你想要的效果(能识别空行/行内空白,输出类似[[], [2], [], [], [], [1], [], [], []]的格式),你需要按行读取输入,而不是直接读取整数。具体步骤:
- 读取
n和m后,必须处理掉nextInt()留下的换行符,否则后续的nextLine()会读到空字符串,导致第一行读取错误。 - 循环
n次,每次读取一行输入,对每行单独处理:- 如果行是空的或者只有空白字符,对应的数组行就是空数组。
- 如果行有数字,就把行分割成数字字符串,再转成整数存入数组。
- 最后按照你想要的格式输出二维数组。
修改后的代码
import java.util.Scanner; import java.util.ArrayList; import java.util.List; class HelloWorld { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); // 关键:吃掉nextInt()之后的换行符,避免第一行读取空内容 sc.nextLine(); // 用List<List<Integer>>更灵活,方便处理空行或元素数量不固定的行 List<List<Integer>> arr = new ArrayList<>(); for (int i = 0; i < n; i++) { String line = sc.nextLine().trim(); List<Integer> row = new ArrayList<>(); if (!line.isEmpty()) { // 按任意数量的空白分割行内容,支持多个空格分隔数字 String[] numStrs = line.split("\\s+"); for (String s : numStrs) { // 可以添加try-catch块处理非数字输入,避免程序崩溃 row.add(Integer.parseInt(s)); } } arr.add(row); } // 按你期望的格式输出 System.out.print("["); for (int i = 0; i < arr.size(); i++) { List<Integer> row = arr.get(i); System.out.print("["); for (int j = 0; j < row.size(); j++) { System.out.print(row.get(j)); if (j != row.size() - 1) { System.out.print(", "); } } System.out.print("]"); if (i != arr.size() - 1) { System.out.print(", "); } } System.out.println("]"); sc.close(); } }
代码细节说明
- 处理换行符:
sc.nextLine()在读取n和m后调用,是为了消耗掉nextInt()读取整数后留在输入流里的换行符,避免第一次读取行时得到空字符串。 - 按行处理逻辑:用
sc.nextLine()读取整行内容,trim()去掉首尾空白后,如果是空的就直接添加空列表;否则用split("\\s+")按任意数量的空白分割,得到每个数字的字符串,再转成整数。 - 灵活存储结构:用
List<List<Integer>>而不是固定长度的二维数组,因为每行的元素个数可能不一样(比如空行对应0个元素),固定数组没法很好处理这种动态情况。 - 格式输出:循环遍历列表,按照
[[], [2], ...]的格式拼接输出,符合你的预期。
关于Java读取含空格的输入
如果是要读取包含空格的字符串(比如带空格的句子),直接用sc.nextLine()就可以,它会读取整行内容直到换行符,包括中间的空格。如果是要读取混合的整数和带空格的字符串,需要注意nextInt()/next()和nextLine()的配合,一定要处理掉换行符,避免读取到空内容。
举个简单例子,读取一个整数和一个带空格的名字:
Scanner sc = new Scanner(System.in); int age = sc.nextInt(); sc.nextLine(); // 吃掉换行符 String name = sc.nextLine(); System.out.println("Age: " + age + ", Name: " + name);
内容的提问来源于stack exchange,提问作者sleep




