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

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());
    }
}

关键细节说明

  1. 资源自动管理:使用try-with-resources语法,确保文件扫描器在使用后自动关闭,避免资源泄漏。
  2. 处理带空格的学科:文件2中的学科(如Computer Science)包含空格,因此读取编号后,会继续读取所有非整数的内容,拼接成完整的学科名称。
  3. 映射高效查找:用HashMap存储编号与学科的关系,保证O(1)的查找效率,适合处理较大的文件。
  4. 异常处理:捕获文件读取过程中的异常,并给出明确的错误提示,方便调试。

测试验证

将示例内容分别存入file1.txt和file2.txt,运行程序后,控制台会输出:

James Computer Science Cody Chemistry John Physics

完全符合你的期望输出。

注意事项

  • 确保文件路径正确:可以将文件放在项目根目录下,或者使用绝对路径。
  • 编号格式适配:如果文件中的编号不是整数,需要调整判断逻辑(比如用正则表达式匹配编号格式)。
  • 重复编号处理:如果文件2中有重复编号,后面的条目会覆盖前面的,若需要保留所有条目,可改用Map<String, List<String>>存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:02:15