如何从单个文本文件填充4个不同ArrayList?问答程序开发求助
多分类问答程序实现方案
嘿,我来帮你搞定这个多分类问答的需求!咱们一步步来,把单ArrayList的版本改成支持4类问题的结构,还能从单个文本文件批量填充数据~
第一步:完善Question类(添加分类属性)
首先,你的Question类需要加一个分类标识字段,这样读取文本时才能知道每个问题该归到哪一类。比如:
public class Question { private String content; // 问题内容 private String answer; // 正确答案 private int category; // 分类编号(1-4对应4类) // 构造方法、getter/setter按需补充 public Question(String content, String answer, int category) { this.content = content; this.answer = answer; this.category = category; } // 省略getCategory()、getContent()、getAnswer()等方法 }
第二步:设计文本文件的格式
单个文本文件里,每行代表一个问题,用分隔符(比如|,注意别和问题内容里的字符冲突)把分类、问题、答案分开。示例格式如下:
1|ArrayList和LinkedList的底层实现有什么区别?|ArrayList基于动态数组,LinkedList基于双向链表 2|HTML中<label>标签的作用是什么?|绑定表单元素,提升可访问性 3|Python中list和tuple的核心差异?|list是可变的,tuple不可变 4|MySQL中GROUP BY的作用?|按指定字段分组聚合数据
这样程序读取时,就能通过分割每行字符串,把数据拆成分类、问题、答案三个部分。
第三步:修改Questions类,添加4个分类ArrayList
把原来的单个questions列表,改成4个对应不同分类的列表,再写一个读取文件填充列表的方法:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; public class Questions { // 4个分类对应的ArrayList private ArrayList<Question> category1Questions = new ArrayList<>(); private ArrayList<Question> category2Questions = new ArrayList<>(); private ArrayList<Question> category3Questions = new ArrayList<>(); private ArrayList<Question> category4Questions = new ArrayList<>(); // 从文本文件加载所有问题的方法 public void loadQuestionsFromFile(String filePath) { try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { String line; while ((line = br.readLine()) != null) { // 跳过空行 if (line.trim().isEmpty()) continue; // 分割每行数据,注意转义|(正则特殊字符) String[] parts = line.split("\\|"); if (parts.length != 3) { System.out.println("无效的问题格式:" + line); continue; } int category = Integer.parseInt(parts[0].trim()); String questionContent = parts[1].trim(); String questionAnswer = parts[2].trim(); // 根据分类添加到对应的列表 Question question = new Question(questionContent, questionAnswer, category); switch (category) { case 1: category1Questions.add(question); break; case 2: category2Questions.add(question); break; case 3: category3Questions.add(question); break; case 4: category4Questions.add(question); break; default: System.out.println("未知分类:" + category); } } } catch (IOException e) { e.printStackTrace(); } catch (NumberFormatException e) { System.out.println("分类编号格式错误"); e.printStackTrace(); } } // 根据用户选择的分类,返回10道随机问题 public ArrayList<Question> getRandomQuestions(int category) { ArrayList<Question> targetList = null; switch (category) { case 1: targetList = category1Questions; break; case 2: targetList = category2Questions; break; case 3: targetList = category3Questions; break; case 4: targetList = category4Questions; break; default: System.out.println("无效分类"); return new ArrayList<>(); } // 打乱列表后取前10个(不足10个则取全部) ArrayList<Question> randomQuestions = new ArrayList<>(targetList); Collections.shuffle(randomQuestions); int takeCount = Math.min(10, randomQuestions.size()); return new ArrayList<>(randomQuestions.subList(0, takeCount)); } }
第四步:使用示例
在主程序里你可以这么调用:
public class Main { public static void main(String[] args) { Questions questionBank = new Questions(); // 加载文本文件里的问题 questionBank.loadQuestionsFromFile("questions.txt"); // 假设用户选择了分类2 ArrayList<Question> selectedQuestions = questionBank.getRandomQuestions(2); // 遍历展示问题,添加用户答题逻辑 for (Question q : selectedQuestions) { System.out.println("问题:" + q.getContent()); // 这里可以加用户输入答案、判断对错的代码 } } }
一些小提示
- 文本文件路径要确保正确,和项目根目录同级别直接写文件名即可,其他位置写绝对路径。
- 如果担心分隔符冲突,可以换用更特殊的符号(比如
###),只要问题内容里不会出现就行。 - 如果某类问题不足10道,代码会自动取全部,你可以根据需求调整(比如提示用户该类问题数量不足)。
内容的提问来源于stack exchange,提问作者palumbes
相关产品推荐
相关产品推荐

