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

Java辐射读数代码优化:如何用substring截取省略输出内容

解决Java辐射读数输出内容截断问题

我看了你的代码,核心问题是你尝试的字符串截断逻辑没有正确集成到输出流程里,还有几个小细节(比如未定义的变量、语法错误)需要调整。下面是修复后的完整代码,以及关键修改点的说明:

关键问题分析

  • 你注释掉的substring代码没有放到正确的输出位置——应该在最后筛选符合条件的行时使用,而不是单独注释起来。
  • 代码里的dataList变量未定义,这会导致编译错误,我假设你是想匹配包含逗号的有效数据行,所以补充了对应的正则表达式。
  • 存在语法错误:System.outprintln应该是System.out.println。

修改后的完整代码

import java.util.*;
import java.io.*;

public class counterRadiation {
    private static String infile = "4_22_18.txt";
    private static String outfile = "4_22_18_stripped.txt";
    private static Scanner reader;
    // 定义匹配有效数据行的正则(假设每行包含逗号,可根据实际格式调整)
    private static final String dataList = ".*,.*";

    public static void main(String[] args) throws Exception {
        try {
            Scanner play = new Scanner(new File(infile));
            Writer writer = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream(outfile), "utf-8"));
            String lineSeparator = System.getProperty("line.separator");
            play.useDelimiter(lineSeparator);

            while (play.hasNext()) {
                String line = play.next();
                // 匹配有效行后写入文件
                if (line.matches(dataList)) {
                    writer.write(line + lineSeparator);
                }
            }
            writer.close();
            play.close();

            try {
                reader = new Scanner(new File(infile));
                ArrayList<String> list = new ArrayList<>();
                while (reader.hasNextLine()) {
                    list.add(reader.nextLine());
                }

                // 提取辐射计数值,添加数组越界防护
                int[] radiCount = new int[list.size()];
                for (int i = 0; i < list.size(); i++) {
                    String[] temp = list.get(i).split(",");
                    if (temp.length >= 3) {
                        radiCount[i] = Integer.parseInt(temp[2]);
                    } else {
                        radiCount[i] = 0; // 无效行设为0,可根据需求调整
                    }
                }

                // 找出最大计数值
                int maxCount = 0;
                for (int count : radiCount) {
                    if (count > maxCount) {
                        maxCount = count;
                    }
                }

                // 输出最大计数上下5范围内的数据,并截断每行前16个字符
                for (int i = 0; i < list.size(); i++) {
                    if (radiCount[i] >= maxCount - 4 && radiCount[i] <= maxCount + 4) {
                        // 用Math.min避免行长度不足16时抛出索引越界异常
                        String truncatedLine = list.get(i).substring(0, Math.min(16, list.get(i).length()));
                        System.out.println(truncatedLine + " " + radiCount[i]);
                    }
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

重点修改说明

  • 字符串截断逻辑:在最后输出符合条件的行时,使用substring(0, Math.min(16, list.get(i).length()))实现截断——添加Math.min是为了避免当行长度不足16时抛出索引越界异常。
  • 修复未定义变量:添加了dataList的正则定义,匹配包含逗号的行(如果你的数据行格式不同,可以修改这个正则)。
  • 数组越界防护:在提取计数值时,判断数组长度是否足够,避免因无效行导致的ArrayIndexOutOfBoundsException。
  • 语法错误修复:修正了System.outprintln的拼写错误。

这样修改后,就能实现你想要的效果:筛选出最大计数上下5范围内的数据,并且每行只输出前16个字符,再加上对应的计数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:59:29