Java 如何从中获取随机测验问题,并在测验中的问题末尾添加听者

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;

我是一名教师,为我的学生创建了一个测验。休息时间已完成。我的firebase实时数据库上有500个问题,我想做的就是随机提问,每次50个问题并且在50个问题后设置一个听众,以显示结果

这是我的测验活动

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引用,然后将获取的数据转换回可以保存这些值的自定义对象。