Java实现两文件匹配内容打印的程序开发技术问询
解决Java文件内容匹配问题:根据编号关联名字与学科
我来帮你实现这个匹配两个文件内容并输出对应关联结果的Java程序!先明确你的需求:
需求细节:
- 文件1内容示例:
James 1 Cody 2 John 3(格式为「名字 + 对应编号」,按顺序排列)- 文件2内容示例:
1 Computer Science 2 Chemistry 3 Physics(格式为「编号 + 对应学科」,学科可能包含空格)- 期望控制台输出:
James Computer Science Cody Chemistry John Physics(名字与对应学科按原顺序关联)
核心思路
要实现这个需求,关键是先把文件2中的「编号-学科」关系存储成键值对映射,然后遍历文件1的内容,每读取一个名字就获取其对应的编号,再从映射中取出学科,最后拼接成结果输出。
完整实现代码
import java.io.File; import java.io.FileScanner; import java.util.HashMap; import java.util.Map; public class FileMatcher { public static void main(String[] args) { // 替换为你的实际文件路径 String file1Path = "file1.txt"; String file2Path = "file2.txt"; // 存储编号到学科的映射 Map<String, String> idSubjectMap = new HashMap<>(); // 第一步:读取文件2,构建映射关系 try (FileScanner file2Scanner = new FileScanner(new File(file2Path))) { while (file2Scanner.hasNext()) { // 读取编号 String id = file2Scanner.next(); // 读取学科(处理带空格的学科名称) StringBuilder subjectBuilder = new StringBuilder(); // 继续读取直到遇到下一个编号(整数) while (file2Scanner.hasNext() && !file2Scanner.hasNextInt()) { subjectBuilder.append(file2Scanner.next()).append(" "); } // 移除末尾多余空格后存入映射 idSubjectMap.put(id, subjectBuilder.toString().trim()); } } catch (Exception e) { System.err.println("读取文件2时发生错误:" + e.getMessage()); return; } // 第二步:读取文件1,匹配并生成结果 StringBuilder resultBuilder = new StringBuilder(); try (FileScanner file1Scanner = new FileScanner(new File(file1Path))) { while (file1Scanner.hasNext()) { // 读取名字和对应的编号 String name = file1Scanner.next(); String id = file1Scanner.next(); // 从映射中获取学科 String subject = idSubjectMap.get(id); if (subject != null) { resultBuilder.append(name).append(" ").append(subject).append(" "); } else { // 处理编号不存在的情况,可根据需求调整 resultBuilder.append(name).append(" [无对应学科] "); } } } catch (Exception e) { System.err.println("读取文件1时发生错误:" + e.getMessage()); return; } // 输出最终结果(移除末尾多余空格) System.out.println(resultBuilder.toString().trim()); } }
关键细节说明
- 资源自动管理:使用
try-with-resources语法,确保文件扫描器在使用后自动关闭,避免资源泄漏。 - 处理带空格的学科:文件2中的学科(如
Computer Science)包含空格,因此读取编号后,会继续读取所有非整数的内容,拼接成完整的学科名称。 - 映射高效查找:用
HashMap存储编号与学科的关系,保证O(1)的查找效率,适合处理较大的文件。 - 异常处理:捕获文件读取过程中的异常,并给出明确的错误提示,方便调试。
测试验证
将示例内容分别存入file1.txt和file2.txt,运行程序后,控制台会输出:
James Computer Science Cody Chemistry John Physics
完全符合你的期望输出。
注意事项
- 确保文件路径正确:可以将文件放在项目根目录下,或者使用绝对路径。
- 编号格式适配:如果文件中的编号不是整数,需要调整判断逻辑(比如用正则表达式匹配编号格式)。
- 重复编号处理:如果文件2中有重复编号,后面的条目会覆盖前面的,若需要保留所有条目,可改用
Map<String, List<String>>存储。
内容的提问来源于stack exchange,提问作者whatthefish
相关产品推荐
相关产品推荐

