package com.ybw.mathapp.service; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.HashSet; import java.util.Set; import com.ybw.mathapp.entity.User; /** * 题目查重器,负责加载历史题目并检查新题目是否重复。 * *

该类维护一个题目集合,用于检测当前生成的题目是否与用户的历史题目重复。 * 通过加载用户目录下的所有历史试卷文件,提取题目内容进行去重检查。 * * @author 杨博文 * @version 1.0 * @since 2025 */ public class QuestionDeduplicator { /** * 存储用户历史题目的集合。 */ private final Set existingQuestions = new HashSet<>(); /** * 加载指定用户的所有历史题目。 * *

该方法遍历用户目录下的所有.txt文件,读取并解析题目内容, * 将历史题目添加到去重集合中。此操作会清空之前的题目记录。 * * @param user 需要加载历史题目的用户对象 */ public void loadExistingQuestions(User user) { existingQuestions.clear(); String userDir = "./" + user.getName(); File dir = new File(userDir); if (!dir.exists()) { return; // 目录不存在,无历史题目 } File[] files = dir.listFiles((d, name) -> name.endsWith(".txt")); if (files == null) { return; } for (File file : files) { try (BufferedReader br = new BufferedReader(new FileReader(file))) { String line; while ((line = br.readLine()) != null) { // 只加载题目行,忽略题号和空行 if (line.trim().isEmpty() || line.matches("\\d+\\. .*")) { String questionContent = line.replaceFirst("\\d+\\. ", "").trim(); if (!questionContent.isEmpty() && !questionContent.equals("=")) { existingQuestions.add(questionContent); } } } } catch (IOException e) { System.err.println("读取历史文件时出错: " + file.getName()); } } } /** * 检查指定题目是否为重复题目。 * *

该方法检查给定的题目是否已经存在于历史题目集合中。 * * @param question 待检查的题目内容 * @return 如果题目重复则返回true,否则返回false */ public boolean isDuplicate(String question) { return existingQuestions.contains(question); } /** * 将新题目添加到去重集合中。 * *

该方法将当前生成的题目添加到去重集合中,用于防止 * 在同一次生成过程中出现重复题目。 * * @param question 需要添加的题目内容 */ public void addQuestion(String question) { existingQuestions.add(question); } }