|
|
|
@ -1,31 +1,96 @@
|
|
|
|
|
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++) {
|
|
|
|
|
builder.append(i).append(". ").append(problemsGenerator.generate()).append("\n\n");
|
|
|
|
|
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 folder = "doc/" + users.getName();
|
|
|
|
|
java.io.File dir = new java.io.File(folder);
|
|
|
|
|
if (!dir.exists()) {
|
|
|
|
|
dir.mkdirs();
|
|
|
|
|
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")) + ".txt";
|
|
|
|
|
FileWriter writer = new FileWriter(folder + "/" + filename);
|
|
|
|
|
writer.write(content);
|
|
|
|
|
writer.close();
|
|
|
|
|
.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());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|