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