Android Studio基础测验App开发:二维数组随机选值实现咨询
给Android测验App新手的方向指引
嘿,作为刚上手Android Studio的新手,能想到用二维数组来关联主题和题目,这个思路其实挺直观的!不过咱们可以结合你的需求,聊聊更合适的方案和具体的操作方向~
先说说二维数组的优劣势
二维数组的好处是简单直接,适合内容不多的静态测验场景,上手快。但缺点也很明显:
- 要是以后想加更多主题、题目,或者给它们加额外属性(比如题目难度、主题描述),修改数组会特别麻烦;
- 数据和逻辑耦合得太死,不利于后期扩展(比如以后想从网络加载题目,二维数组就很难适配)。
更优的方案:面向对象的实体类设计
其实用面向对象的方式来定义主题和题目,会让你的代码结构更清晰,扩展性更强。你可以创建两个实体类:
Topic:包含主题名称,以及该主题下关联的所有题目列表;Question:包含题目内容,以及该题目关联的所有主题列表。
举个简单的代码例子:
// 主题类 public class Topic { private String name; private List<Question> relatedQuestions; public Topic(String name, List<Question> relatedQuestions) { this.name = name; this.relatedQuestions = relatedQuestions; } // 省略getter、setter方法 } // 题目类 public class Question { private String content; private List<Topic> relatedTopics; public Question(String content, List<Topic> relatedTopics) { this.content = content; this.relatedTopics = relatedTopics; } // 省略getter、setter方法 }
这种设计的好处是,你可以轻松给主题或题目加新属性,以后要扩展功能(比如统计每个主题的答题正确率)也会方便很多。
核心逻辑:用户选择后的测验生成
不管你用二维数组还是实体类,核心思路都是先筛选出符合用户选择的题目集合,再随机打乱,而不是去修改原数组或者新建数组,这样更高效也更清晰:
如果用实体类的实现步骤
- 先收集用户选中的主题和题目;
- 把选中主题下的所有题目加入一个集合(用Set可以自动去重,避免重复题目);
- 再把选中题目关联的所有主题下的题目也加入集合;
- 把集合转成列表,用
Collections.shuffle()随机打乱,就得到了测验的题目列表。
代码示例:
// 假设你已经有了所有主题和题目的列表 List<Topic> allTopics = ...; List<Question> allQuestions = ...; // 用户选中的主题和题目 List<Topic> selectedTopics = ...; List<Question> selectedQuestions = ...; // 用Set来存符合条件的题目,自动去重 Set<Question> eligibleQuestions = new HashSet<>(); // 处理选中的主题:加入对应所有题目 for (Topic topic : selectedTopics) { eligibleQuestions.addAll(topic.getRelatedQuestions()); } // 处理选中的题目:加入其关联主题下的所有题目 for (Question question : selectedQuestions) { for (Topic topic : question.getRelatedTopics()) { eligibleQuestions.addAll(topic.getRelatedQuestions()); } } // 转成列表并随机打乱 List<Question> quizQuestions = new ArrayList<>(eligibleQuestions); Collections.shuffle(quizQuestions); // 现在quizQuestions就是可以直接用的随机测验题目啦
如果坚持用二维数组的实现步骤
假设你的二维数组boolean[][] topicQuestionLink,topicQuestionLink[i][j]为true表示第i个主题和第j个题目有关联:
- 收集用户选中的主题索引和题目索引;
- 筛选出所有符合条件的题目索引,存入Set去重;
- 转成列表后打乱,再根据索引去取对应的题目内容。
代码示例:
// 用户选中的主题索引和题目索引 List<Integer> selectedTopicIds = ...; List<Integer> selectedQuestionIds = ...; Set<Integer> eligibleQuestionIds = new HashSet<>(); // 处理选中的主题 for (int topicId : selectedTopicIds) { for (int j = 0; j < topicQuestionLink[topicId].length; j++) { if (topicQuestionLink[topicId][j]) { eligibleQuestionIds.add(j); } } } // 处理选中的题目:找到关联的主题,再加入对应题目 for (int questionId : selectedQuestionIds) { for (int i = 0; i < topicQuestionLink.length; i++) { if (topicQuestionLink[i][questionId]) { for (int j = 0; j < topicQuestionLink[i].length; j++) { if (topicQuestionLink[i][j]) { eligibleQuestionIds.add(j); } } } } } // 打乱索引列表 List<Integer> quizQuestionIds = new ArrayList<>(eligibleQuestionIds); Collections.shuffle(quizQuestionIds);
搜索关键词建议
平时遇到问题可以搜这些关键词,能帮你找到更精准的解决方案:
Android quiz app multi topic selection(多主题选择的测验App实现)Java shuffle list of objects(Java中打乱对象列表)Android Room database for quiz questions(如果以后想把题目存在本地数据库)Android RecyclerView for quiz selection(用RecyclerView做主题/题目选择界面)
内容的提问来源于stack exchange,提问作者Samm




