|
|
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;
|
|
|
|
|
|
/**
|
|
|
* 题目查重器,负责加载历史题目并检查新题目是否重复。
|
|
|
*
|
|
|
* <p>该类维护一个题目集合,用于检测当前生成的题目是否与用户的历史题目重复。
|
|
|
* 通过加载用户目录下的所有历史试卷文件,提取题目内容进行去重检查。
|
|
|
*
|
|
|
* @author 杨博文
|
|
|
* @version 1.0
|
|
|
* @since 2025
|
|
|
*/
|
|
|
public class QuestionDeduplicator {
|
|
|
|
|
|
/**
|
|
|
* 存储用户历史题目的集合。
|
|
|
*/
|
|
|
private final Set<String> existingQuestions = new HashSet<>();
|
|
|
|
|
|
/**
|
|
|
* 加载指定用户的所有历史题目。
|
|
|
*
|
|
|
* <p>该方法遍历用户目录下的所有.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());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 检查指定题目是否为重复题目。
|
|
|
*
|
|
|
* <p>该方法检查给定的题目是否已经存在于历史题目集合中。
|
|
|
*
|
|
|
* @param question 待检查的题目内容
|
|
|
* @return 如果题目重复则返回true,否则返回false
|
|
|
*/
|
|
|
public boolean isDuplicate(String question) {
|
|
|
return existingQuestions.contains(question);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 将新题目添加到去重集合中。
|
|
|
*
|
|
|
* <p>该方法将当前生成的题目添加到去重集合中,用于防止
|
|
|
* 在同一次生成过程中出现重复题目。
|
|
|
*
|
|
|
* @param question 需要添加的题目内容
|
|
|
*/
|
|
|
public void addQuestion(String question) {
|
|
|
existingQuestions.add(question);
|
|
|
}
|
|
|
} |