You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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方法
}

这种设计的好处是,你可以轻松给主题或题目加新属性,以后要扩展功能(比如统计每个主题的答题正确率)也会方便很多。

核心逻辑:用户选择后的测验生成

不管你用二维数组还是实体类,核心思路都是先筛选出符合用户选择的题目集合,再随机打乱,而不是去修改原数组或者新建数组,这样更高效也更清晰:

如果用实体类的实现步骤

  1. 先收集用户选中的主题和题目;
  2. 把选中主题下的所有题目加入一个集合(用Set可以自动去重,避免重复题目);
  3. 再把选中题目关联的所有主题下的题目也加入集合;
  4. 把集合转成列表,用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[][] topicQuestionLinktopicQuestionLink[i][j]true表示第i个主题和第j个题目有关联:

  1. 收集用户选中的主题索引和题目索引;
  2. 筛选出所有符合条件的题目索引,存入Set去重;
  3. 转成列表后打乱,再根据索引去取对应的题目内容。

代码示例:

// 用户选中的主题索引和题目索引
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

火山引擎 最新活动