You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取含类二维数组的文本文件,求列和并跳过首列的Java问题

解决Java读取文本文件列求和的问题

现有代码的核心问题

  • 直接拼接所有行成一个字符串,丢失了行边界,导致跨行内容被错误合并(比如第一行末尾的9和第二行开头的0002被拼成90002,完全无法解析)
  • 没有实现列求和的核心逻辑,仅做了简单的内容输出

修正方案与代码实现

我们需要逐行处理数据,单独解析每行的内容,同时初始化求和数组来累加每列的数值:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ColumnSumCalculator {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\Tommy\\Documents\\day.txt");
        int[] columnSums = null;

        // 使用try-with-resources自动关闭Scanner,避免资源泄漏
        try (Scanner reader = new Scanner(file)) {
            while (reader.hasNextLine()) {
                String line = reader.nextLine().trim();
                // 跳过空行
                if (line.isEmpty()) {
                    continue;
                }
                // 分割每行内容,\\s+匹配任意数量的空格/制表符
                String[] parts = line.split("\\s+");

                // 第一次读取时初始化求和数组(跳过首列,所以长度是parts.length-1)
                if (columnSums == null) {
                    if (parts.length < 2) {
                        // 没有可求和的列,直接退出
                        System.out.println("文件内容格式不正确,没有可求和的列");
                        return;
                    }
                    columnSums = new int[parts.length - 1];
                }

                // 跳过首列(parts[0]),从索引1开始遍历并累加
                for (int i = 1; i < parts.length; i++) {
                    try {
                        int num = Integer.parseInt(parts[i]);
                        // 对应求和数组的索引是i-1(因为跳过了首列)
                        columnSums[i - 1] += num;
                    } catch (NumberFormatException e) {
                        System.out.println("无效的数字格式:" + parts[i]);
                    }
                }
            }
        } catch (FileNotFoundException e) {
            System.out.println("未找到文件:" + file.getAbsolutePath());
            e.printStackTrace();
            return;
        }

        // 输出结果
        if (columnSums != null) {
            for (int i = 0; i < columnSums.length; i++) {
                System.out.printf("array[%d] = %d%n", i, columnSums[i]);
            }
        }
    }
}

关键细节说明

  • 逐行处理:每次读取一行就直接解析,彻底避免了跨行内容拼接的错误
  • 灵活分割:用split("\\s+")代替split(" "),可以兼容文本中多个空格分隔的情况
  • 初始化求和数组:通过第一行的列数确定求和数组的长度,适配不同的文件格式
  • 异常处理:增加了文件不存在、数字格式错误的处理,让代码更健壮
  • 资源自动管理:try-with-resources会自动关闭Scanner,无需手动调用close()

运行上述代码后,针对示例文本会输出符合预期的结果:

array[0] = 4
array[1] = 7
array[2] = 10
array[3] = 13
array[4] = 16
array[5] = 19
array[6] = 22
array[7] = 25
array[8] = 28

内容的提问来源于stack exchange,提问作者toad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:15:27