From 4c0486861bd54fa8ce276adf06bda4a5f8286e8e Mon Sep 17 00:00:00 2001 From: hnu202326010305 <1405671544@qq.com> Date: Sun, 28 Sep 2025 00:57:13 +0800 Subject: [PATCH] Update Generator.java --- src/Generator.java | 83 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 74 insertions(+), 9 deletions(-) diff --git a/src/Generator.java b/src/Generator.java index e6bb1ef..a8a2fd1 100644 --- a/src/Generator.java +++ b/src/Generator.java @@ -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 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 loadHistory(Users users) { + Set 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()); } }