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.

98 lines
2.9 KiB

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
/**
* 题目生成器,支持历史查重和文件保存
*/
public class Generator {
//生成题目并保存到用户文件夹
public static void generate(Users users, int count, ProblemsGenerator problemsGenerator) {
Set<String> history = loadHistory(users);
StringBuilder builder = new StringBuilder();
for (int i = 1; i <= count; i++) {
String problem;
int tries = 0;
do {
problem = problemsGenerator.generate();
tries++;
if (tries >= 20) {
System.out.println("警告:尝试 20 次仍未生成新题目,可能题目库有限。");
break;
}
} while (history.contains(problem));
history.add(problem);
builder.append(i).append(". ").append(problem).append("\n\n");
}
save(users, builder.toString());
System.out.println("题目生成完成。");
}
/**
* 读取用户历史题目
*/
private static Set<String> loadHistory(Users users) {
Set<String> history = new HashSet<>();
String safeName = users.getName().replaceAll("[^\\u4e00-\\u9fa5a-zA-Z0-9_]", "_");
String folder = "doc/" + safeName;
File dir = new File(folder);
if (!dir.exists()) return history;
File[] files = dir.listFiles((d, name) -> name.endsWith(".txt"));
if (files != null) {
for (File f : files) {
try (Scanner sc = new Scanner(f)) {
while (sc.hasNextLine()) {
String line = sc.nextLine().trim();
if (!line.isEmpty() && Character.isDigit(line.charAt(0))) {
int dot = line.indexOf('.');
if (dot != -1) line = line.substring(dot + 1).trim();
history.add(line);
}
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("读取历史题目失败:" + e.getMessage());
}
}
}
return history;
}
/**
* 保存生成题目到文件
*/
private static void save(Users users, String content) {
try {
String safeName = users.getName().replaceAll("[^\\u4e00-\\u9fa5a-zA-Z0-9_]", "_");
String folder = "doc/" + safeName;
File dir = new File(folder);
if (!dir.exists() && !dir.mkdirs()) {
System.out.println("无法创建目录: " + folder);
return;
}
String filename = LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss"))
+ "-" + (int) (Math.random() * 1000) + ".txt";
try (FileWriter writer = new FileWriter(folder + "/" + filename)) {
writer.write(content);
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("保存失败:" + e.getMessage());
}
}
}