You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java中读取含空格输入的方法及二维数组输入忽略空格问题排查

问题分析与解决方案

咱们来一步步拆解你的问题哈~首先你的代码出现异常的核心原因,是**Scanner.nextInt()的工作机制**:它会自动跳过所有空白字符(包括空格、换行、制表符),只提取整数内容。不管你输入时用空格还是换行分隔数字,它都只会按整数个数来读取,完全忽略空白的类型——这就是为什么程序会持续等待输入(它要凑够n*m个整数才会停止),而且没法识别空行/空输入(对应你想要的空数组元素)。

解决思路

要实现你想要的效果(能识别空行/行内空白,输出类似[[], [2], [], [], [], [1], [], [], []]的格式),你需要按行读取输入,而不是直接读取整数。具体步骤:

  1. 读取nm后,必须处理掉nextInt()留下的换行符,否则后续的nextLine()会读到空字符串,导致第一行读取错误。
  2. 循环n次,每次读取一行输入,对每行单独处理:
    • 如果行是空的或者只有空白字符,对应的数组行就是空数组。
    • 如果行有数字,就把行分割成数字字符串,再转成整数存入数组。
  3. 最后按照你想要的格式输出二维数组。

修改后的代码

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()在读取nm后调用,是为了消耗掉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

火山引擎 最新活动