我对Android Studio有点新意,我想制作小测验应用。在开始屏幕上,有两个按钮。使用第一个按钮,您只需单击您的问题,然后您可以根据需要从特定的问题编号开始(这已经有效)。使用第二个按钮,我会创建一个随机模式,但每个问题只应该被问到一次。因此,不应该有两次获得相同问题的可能性。
为此,我创建了一个数组:
public ArrayList<Integer> questionsDone = new ArrayList<>();
得到问题数组的长度:
public int maxQuestions = QuestionLibrary.nQuestions.length;
然后我有一个更新问题的功能:
private void updateQuestion(){
//RANDOM MODE
if (startNumber == -1) {
if (questionsDone.size() >= maxQuestions) {
finishQuiz();
} else {
nQuestionNumber = (int) (Math.random() * (maxQuestions));
do {
if (questionsDone.contains(nQuestionNumber)) {
nQuestionNumber = nQuestionNumber - 1;
if (nQuestionNumber == -1) {
nQuestionNumber = maxQuestions-1;
}
} else {
questionsDone.add(nQuestionNumber);
notDone = true;
}
} while (notDone = false);
}
}
nQuestionView.setText(nQuestionLibrary.getQuestion(nQuestionNumber));
nButtonChoice1.setText(nQuestionLibrary.getChoice1(nQuestionNumber));
nButtonChoice2.setText(nQuestionLibrary.getChoice2(nQuestionNumber));
nButtonChoice3.setText(nQuestionLibrary.getChoice3(nQuestionNumber));
所以我的想法是,当我开始随机模式时,我传递值“-1”。如果数组的大小(问题已完成)等于可用问题的数量,则测验应该停止。如果没有,我只是得到一个随机数并乘以问题数。然后有一个do-while函数,它确保如果questionsDone-Array已经包含数字,它将获得一个新数字,并且在获得一个不在数组中的数字后,它将被存储在数组中。
当我点击随机模式时,这就是应用程序的作用:
它始终显示一个随机问题,但有时会问一次问题两次甚至更多。然后它突然停止(应用程序正在加载结果页面),但停止时没有模式。当我有7个问题时,每个问题最少询问一次,有时在15个之后停止,有时在20个问题之后停止等等。
有人知道为什么吗?
答案 0 :(得分:0)
由于我想向你们两个人提供更新,我发布了一个anwser。谢谢大家的好意见。它现在有效,这就是我的工作方式:
首先我创建了一个数组:
FILE_TMP="/temp.list"
while IFS= read line
do
ping $line
done < "$FILE_TMP"
然后我将整数放在数组中,从0开始,结束maxQuestions-1,然后我拖拽了这些值:
public ArrayList<Integer> availableQuestions = new ArrayList<>();
然后在每个按钮上单击此函数开始工作(j被声明为一个值为0的整数):
if (startNumber == -1) {
Integer i = 0;
do {
availableQuestions.add(i);
i++;
}while (i < maxQuestions);
Collections.shuffle(availableQuestions);
}
答案 1 :(得分:-1)
我建议保留QuestionAvailable(即尚未回答)作为库中问题的索引,而不是保留QuestionsDone
List<Integer> availableQuestions = null;
...................................................
if (startNumber == -1) {
if (availableQuestions.isEmpty()) {
finishQuiz();
availableQuestions = null;
} else {
if (availableQuestions == null) {
// Starting a new quiz
availableQuestions = new List<Integer>(maxQuestions);
for (int i=0; i<maxQuestons; i++) availableQuestions.Add(i);
}
int nQuestionOrder = (int) (Math.random() * availableQuestions.size());
nQuestionNumber = availableQuestions.get(nQuestionOrder);
availableQuestions.removeAt(nQuestionOrder);
}
}