Java 如何从中获取随机测验问题,并在测验中的问题末尾添加听者
我是一名教师,为我的学生创建了一个测验。休息时间已完成。我的firebase实时数据库上有500个问题,我想做的就是随机提问,每次50个问题并且在50个问题后设置一个听众,以显示结果 这是我的测验活动Java 如何从中获取随机测验问题,并在测验中的问题末尾添加听者,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我是一名教师,为我的学生创建了一个测验。休息时间已完成。我的firebase实时数据库上有500个问题,我想做的就是随机提问,每次50个问题并且在50个问题后设置一个听众,以显示结果 这是我的测验活动 public class grandtest extends AppCompatActivity { TextView mQuestionTextView; ProgressBar mProgressBar; Button bchoice1,bchoice2,bchoice3,bchoice4;
public class grandtest extends AppCompatActivity {
TextView mQuestionTextView;
ProgressBar mProgressBar;
Button bchoice1,bchoice2,bchoice3,bchoice4;
Random Rand;
String mAnswer;
Timer mTimer;
TextView mScoreTextView;
public static int mScore;
int mQuestionNo = 0;
private Firebase mQuestionRef;
private Firebase mChoice1Ref;
private Firebase mChoice2Ref;
private Firebase mChoice3Ref;
private Firebase mChoice4Ref;
private Firebase mAnswerRef;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grandtest);
mQuestionTextView = findViewById(R.id.mquestiontextview);
mProgressBar = findViewById(R.id.progressBar);
bchoice1 = findViewById(R.id.choice1);
bchoice2 = findViewById(R.id.choice2);
bchoice3 = findViewById(R.id.choice3);
bchoice4 = findViewById(R.id.choice4);
mScoreTextView = findViewById(R.id.mScore);
}
public void updateQuestion (){
mQuestionRef = new Firebase("https://class9notes-2808b.firebaseio.com/"+mQuestionNo +"/question");
mQuestionRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String question = dataSnapshot.getValue(String.class);
mQuestionTextView.setText(question);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Toast.makeText(grandtest.this,"Please enable data",Toast.LENGTH_SHORT).show();
}
});
mChoice1Ref = new Firebase("https://class9notes-2808b.firebaseio.com/"+mQuestionNo+"/choice1");
mChoice1Ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String choice1 = dataSnapshot.getValue(String.class);
bchoice1.setText(choice1);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
mChoice2Ref = new Firebase("https://class9notes-2808b.firebaseio.com/"+mQuestionNo+"/choice2");
mChoice2Ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String choice2 = dataSnapshot.getValue(String.class);
bchoice2.setText(choice2);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
mChoice3Ref = new Firebase("https://class9notes-2808b.firebaseio.com/"+mQuestionNo+"/choice3");
mChoice3Ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String choice3 = dataSnapshot.getValue(String.class);
bchoice3.setText(choice3);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
mChoice4Ref = new Firebase("https://class9notes-2808b.firebaseio.com/"+mQuestionNo+"/choice4");
mChoice4Ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String choice4 = dataSnapshot.getValue(String.class);
bchoice4.setText(choice4);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
mAnswerRef = new Firebase("https://class9notes-2808b.firebaseio.com/"+mQuestionNo+"/answer");
mAnswerRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
mAnswer = (String) dataSnapshot.getValue(String.class);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
mQuestionNo ++;
我想随机化mQuestionNo对象,以便每次检索随机问题。
这是我的firebase数据的结构
- 创建包含所有问题关键值的ArrayList
- 然后从arraylist中选择一个随机键,然后从firebase中选择数据,然后从arraylist中删除该键,然后将计数器递增,并重复此步骤,直到计数器达到50
- 计数器达到50后显示结果
Set<Integer> set = new HashSet<>();
public int getNextQuestionNumber() {
int num = (int) (Math.random() * 500); //Total number of questions in the database.
if (set.contains(num)) {
return getNextQuestionNumber();
} else {
set.add(num);
return num;
}
}
Set Set=newhashset();
public int getNextQuestionNumber(){
int num=(int)(Math.random()*500);//数据库中的问题总数。
if(set.contains(num)){
返回getNextQuestionNumber();
}否则{
set.add(num);
返回num;
}
}
这不会解决您的问题,但会帮助您找到更好的编码方式!:)
创建一个类来包含您的问题
public class Question {
String question;
String choice1;
String choice2;
String choice3;
String choice4;
String answer;
}
然后在您的活动中,您可以只调用一个数据库引用,而不是多个数据库引用
int questionNo = 0;
mDatabase.child(String.valueOf(questionNo)).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Question question = new Question();
question.answer = dataSnapshot.child("answer").getValue().toString();
question.choice1 = dataSnapshot.child("choice1").getValue().toString();
question.choice2 = dataSnapshot.child("choice2").getValue().toString();
question.choice3 = dataSnapshot.child("choice3").getValue().toString();
question.choice4 = dataSnapshot.child("choice4").getValue().toString();
question.question = dataSnapshot.child("question").getValue().toString();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
这里我们在0索引处获取问题
您可以获得50个随机密钥,如下所示:
ArrayList<Integer> questions = new ArrayList<>();
while(questions.size() < 50){
int random = new Random().nextInt(500 + 1) + 1;
if (!questions.contains(random)){
questions.add(random);
//Question added
}else{
//Question already added to list
}
}
ArrayList questions=new ArrayList();
while(questions.size()<50){
int random=new random().nextInt(500+1)+1;
如果(!questions.contains(随机)){
问题。添加(随机);
//补充质询
}否则{
//问题已添加到列表中
}
}
现在,您有了要遍历的问题的关键。然后,您可以调用问题。get(49)要获取所有键中的最后一个问题,请使用此索引检查您的firebase,当firebase获得问题时,您可以使用问题删除此索引。remove(49);然后转到下一个索引。当然,49不应该硬编码,而是设置为int questionCount=49的值;当你完成了所有这些之后,你就会——问题计数
现在这有点假,但希望它能给你一些想法:)你能用实际的方式写吗?这太多步骤了,上面的逻辑对你有用,搜索如何向arraylist添加值,如何从arraylist获取随机项,如何从ArrayListi中删除项可能是创建一个类来处理对象的好主意。您可以调用一个firebase引用,而不是调用6个firebase引用,然后将获取的数据转换回可以保存这些值的自定义对象。