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

Java读取含process令牌的多行文本并存储为对象数组的问题

嘿,我来帮你搞定这个需求!结合你已经在用Scanner的情况,咱们一步步实现你要的功能:

实现方案

核心目标很明确:从自定义多行文本里抓出process<数字>格式的令牌,收集对应数值,生成指定的嵌套列表结构,同时每次处理完一个process就清空临时数值数组。

1. 先搞定正则匹配

咱们需要两个正则来区分令牌和数值:

  • 匹配process令牌:^process(\\d+)$(假设令牌单独占一行,如果你的文本格式是令牌和数值同行,比如process0: 1,2,3,可以后面再调整)
  • 匹配数值:\\d+(如果是浮点数就改成\\d+(\\.\\d+)?)

2. 核心代码实现

用Java写的话,结合Scanner,咱们用List<List<Object>>存最终结果,List<Integer>当临时数值容器:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ProcessDataExtractor {
    public static void main(String[] args) {
        // 最终的结果结构,和你要的格式对应
        List<List<Object>> objects = new ArrayList<>();
        // 临时存当前process的数值
        List<Integer> currentValues = new ArrayList<>();
        // 记录当前正在处理的process名称
        String currentProcess = null;

        // 预编译正则模式,提升效率
        Pattern processPattern = Pattern.compile("^process(\\d+)$");
        Pattern numberPattern = Pattern.compile("\\d+");

        // 用try-with-resources自动关闭Scanner,避免资源泄漏
        try (Scanner scanner = new Scanner(new File("你的文件路径.txt"))) {
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine().trim();
                if (line.isEmpty()) {
                    continue; // 跳过空行,避免干扰
                }

                // 先判断当前行是不是process令牌
                Matcher processMatcher = processPattern.matcher(line);
                if (processMatcher.matches()) {
                    // 如果之前有未完成的process,先把它加入结果
                    if (currentProcess != null && !currentValues.isEmpty()) {
                        List<Object> processEntry = new ArrayList<>();
                        processEntry.add(currentProcess);
                        // 这里要拷贝一个新的List,不然后续清空会影响结果里的数值
                        processEntry.add(new ArrayList<>(currentValues));
                        objects.add(processEntry);
                        // 立即清空临时数值数组,准备存下一个process的数值
                        currentValues.clear();
                    }
                    // 更新当前处理的process名称
                    currentProcess = line;
                } else {
                    // 处理数值行,一行可能有多个数值,所以循环匹配
                    Matcher numberMatcher = numberPattern.matcher(line);
                    while (numberMatcher.find()) {
                        int value = Integer.parseInt(numberMatcher.group());
                        currentValues.add(value);
                    }
                }
            }

            // 别忘了处理文件最后一个process(文件末尾没有新的process令牌触发存储)
            if (currentProcess != null && !currentValues.isEmpty()) {
                List<Object> processEntry = new ArrayList<>();
                processEntry.add(currentProcess);
                processEntry.add(new ArrayList<>(currentValues));
                objects.add(processEntry);
                currentValues.clear(); // 最后也清空一次,符合你的要求
            }

            // 打印结果,和你要的格式完全一致
            System.out.println("objects" + objects);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

3. 关键细节要注意

  • 清空时机:每次遇到新的process令牌时,先把上一个process的条目存入结果,然后立刻调用currentValues.clear();文件处理完后,也要处理最后一个process并清空数组。
  • List拷贝:存入结果时一定要用new ArrayList<>(currentValues),因为List是引用类型,直接存原List的话,后续清空会把结果里的数值也删掉。
  • 正则灵活调整:如果你的文本格式是process和数值在同一行(比如process0: 1,2,3),那可以把正则改成^(process\\d+):(.*)$,先匹配整行提取令牌和数值部分,再拆分数值部分。

4. 测试一下

假设你的文本文件内容是:

process0
1
2
3
4
5
process1
6
7
8
9
10
process2
1
2

运行代码后会输出:
objects[[process0, [1, 2, 3, 4, 5]], [process1, [6, 7, 8, 9, 10]], [process2, [1, 2]]]
完全符合你想要的格式!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:46:09