如何在不重复 SQLite 的情况下随机化问题?

How to randomize questions without repetition from SQLite?

我正在我的 android 工作室开发一个简单的测验。我正在使用数据库,但我想在每次用户单击测验按钮时随机分配问题。到目前为止,我已经创建了 5 个示例问题。

我建议这样做:

选项 1:如果您不想重复问题

  1. 使用集合,因为 Sets 不允许重复并且列表可以随机排列

  2. 调整(如果还没有)你的class问题,这样你就可以在集合中使用,因此不允许重复......(通过这个覆盖等于和哈希码)

  3. 填充集合,打乱它,得到它的随机元素


选项2:如果你只想随机选择其中一题

这个完全一样,

  1. 不要使用集合,而是使用列表...
  2. 省略第 2 步,因为重复的问题没什么大不了的...
  3. 但仍然填充集合,将其洗牌,随机获取其中的一个元素

你来了 :)

List<Question> 上使用 Collections.shuffle,然后在单击按钮时使用 Iterator<Question> 选择问题。

假设您为 Question class 同时实现了 equalshashcode,那么 LinkedHashSet 将删除重复项,因此不会重复发生了。

这是一个基于您的 class 的 Activity,它应该展示这些概念。

public class QuizActivityMarketing extends Activity {

    private Iterator<Question> questionIterator;
    private TextView txtQuestion;
    private RadioButton rda, rdb, rdc, rdd;
    private Button butNext;

    private Question currentQ;
    private int score = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Define your views
        txtQuestion = (TextView) findViewById(R.id.textView1);
        rda = (RadioButton) findViewById(R.id.radio0);
        rdb = (RadioButton) findViewById(R.id.radio1);
        rdc = (RadioButton) findViewById(R.id.radio2);
        rdd = (RadioButton) findViewById(R.id.radio3);
        butNext = (Button) findViewById(R.id.button1);

        // Get and randomize the questions
        DbHelperMarketing db = new DbHelperMarketing(this);
        final List<Question> questions = db.getAllQuestions();
        Collections.shuffle(questions);
        questionIterator = new LinkedHashSet<Question>(questions).iterator();

        // Setup the first question
        if (questionIterator.hasNext()) {
            currentQ = questionIterator.next();
            setQuestionView(currentQ);
        }

        // Hook up the button-clicking
        butNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // Check the correct answer
                RadioGroup grp = (RadioGroup) findViewById(R.id.radioGroup1);
                RadioButton answer = (RadioButton) findViewById(grp.getCheckedRadioButtonId());
                Log.d("yourans", currentQ.getANSWER() + " " + answer.getText());
                if (currentQ.getANSWER().equals(answer.getText())) {
                    score++;
                    Log.d("score", "Your score" + score);
                }

                // Load the next question, if there are any
                if (questionIterator.hasNext()) {
                    currentQ = questionIterator.next();
                    setQuestionView(currentQ);
                } else { // Done asking questions
                    setQuestionView(null);

                    Intent intent = new Intent(QuizActivityMarketing.this, ResultActivity.class);
                    Bundle b = new Bundle();
                    b.putInt("score", score); //Your score
                    intent.putExtras(b); //Put your score to your next Intent
                    startActivity(intent);
                    finish();
                }
            }
        });
    }

    private void setQuestionView(Question currentQuestion) {
        if (currentQuestion != null) {
            txtQuestion.setText(currentQuestion.getQUESTION());
            rda.setText(currentQuestion.getOPTA());
            rdb.setText(currentQuestion.getOPTB());
            rdc.setText(currentQuestion.getOPTC());
            rdd.setText(currentQuestion.getOPTD());
        } else {
            txtQuestion.setText("");
            rda.setText("");
            rdb.setText("");
            rdc.setText("");
            rdd.setText("");
        }
    }

}