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
相关产品推荐
相关产品推荐

