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 该方法遍历用户目录下的所有.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);
}
}