You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pairedProject/src/main/java/com/ybw/mathapp/service/QuestionDeduplicator.java

91 lines
2.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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