【问题标题】:How to randomly pick element from array without repeating?如何从数组中随机选择元素而不重复?
【发布时间】:2017-01-05 09:26:08
【问题描述】:

我正在开发一个测验应用程序。我设法用

将问题(来自数组)随机化
int position = new Random().nextInt(questions.length);

但问题不断重复。当它到达时我如何让它停止让我们说 10 个问题而不重复?如果有帮助,这是我的代码:

gcfQuiz.setText(questions[position]);

    gcfButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            EditText Answer = (EditText) findViewById(R.id.txtAns1);
            String finAns = Answer.getText().toString();

            if (finAns==answers[position]){

                correct++;
            }
            position++;
            if (position<questions.length)
            {
                gcfQuiz.setText(questions[position]);

            }else {
                Intent in = new Intent(getApplicationContext(), gcfResult.class);
                startActivity(in);
            }
        }
    });

【问题讨论】:

  • 使用 ArrayList 并在随机选择后删除问题。

标签: android arrays android-studio


【解决方案1】:

您可以改用List,然后删除被选中的元素:

List<Question> questions = new ArrayList<Question>();
// For Question class, see below.

// Get some random valid index from the list.
int index = new Random().nextInt(questions.size());
// Remove the question from the list and store it into a variable.
Question currQuestion = questions.remove(i);

为了您的信息,我假设Question 类看起来像这样。这种方法通常比分别带有问题和答案的两个单独的数组要好:

class Question {

    private String text;
    private String answer;

    public Question(String text, String answer) {
        this.text = text;
        this.answer = answer;
    }

    public boolean isCorrectAnswer(String inputAnswer) {
        return Objects.equals(answer, inputAnswer);
    }
}

一些提示

【讨论】:

  • 我的问题和答案数组都和代码在同一个类中。如果单独上课会更好吗?感谢您的回答
  • 是的,这就是整个idea of object-oriented programming,尤其是封装:你把逻辑上属于彼此的东西放在一个类中。每个问题都有一个正确答案,您将检查答案是否正确的责任转移到问题上。
【解决方案2】:
    int n=questions.length;
//if n=100 means it give random numb with no duplicate values with in the range 100.
    Random r = new Random();
    Set<Integer> positionvalue = new HashSet<>();
    for(int i = 0; i <n; i++){
            while(true) {
            int number = r.nextInt(n) + 1;
            if (positionvalue.contains(number) == false) {
                positionvalue.add(number);                   
                break;
            }
        }
    }

位置值集在您的范围(n)之间具有不重复的随机数

【讨论】:

  • 谢谢,但我应该在哪个部分插入问题?抱歉,我是新手
【解决方案3】:

创建一个问题列表并随机播放(通过Collections.shuffle())一次以获得随机顺序的问题:

List<String> randomQuestionList = new ArrayList<>();
randomQuestionList.addAll(Arrays.asList(questions));
Collections.shuffle(randomQuestionList);

现在您有一个随机排序的问题列表。

注意我在你的代码中看到,你的答案在一个单独的数组中。为了使这种随机播放解决方案适合您,您需要将问题和答案放在一起。实现这一目标的最佳方法可能是创建一个包含问题和答案的 Question 类。然后,您可以随机排列问题,并且手头仍然可以找到每个问题的答案。

class Question {
    String question;
    String[] answers;
}

List<Question> randomQuestionList ... 

【讨论】:

  • 我怎么知道答案是否正确?感谢您的回答
  • 您应该知道,您的哪个答案是正确的 :-) 您可以使用正确答案的索引向 Question 类添加一个字段,或者创建一个带有文本和权利的 Answer 类/错误标志(这也可以处理您可以有超过 1 个正确答案的情况)。
  • 请注意,您可能也应该以随机顺序显示答案——您可以再次使用 shuffle() :-)
【解决方案4】:

取两个全局变量

int nextQuestion;
List<Integer> posList;

然后初始化它:

private void initRandomLogic() {
    nextQuestion = 0;
    posList  = new ArrayList<>();
    for(int i=0;i<questions.length;i++)
        posList.add(i);
    Collections.shuffle(posList);
}

private int getRandomPosition() {
    return posList.get(nextQuestion++);
}

希望能帮到你!

【讨论】:

    猜你喜欢
    • 2015-04-12
    • 2015-09-21
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    相关资源
    最近更新 更多