【问题标题】:Output of random elements should not duplicate随机元素的输出不应重复
【发布时间】:2017-12-21 03:08:24
【问题描述】:

我制作了一个测验应用程序,其中有一个包含问题、选项和正确答案的数组列表。我已经设置了问题将随机化。但是随机化的问题会重复一次或多次。如何设置每个问题只发生一次?在问题库中是数组列表,在测验活动中是随机发生器和其他东西。代码:

    package amapps.impossiblequiz;

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;

    public class QuestionLibrary {

private final String[] [] mChoices ={
        {"1993", "1986", "1967"},
        {"-260", "-272,15", "279,15"},
        {"a plant","The active substance of marijuana" , "a spider"},
        {"6", "10","8"},
        {"12","15","10"},
        {"Uranus","Neptune","Saturn"},
        {"HCl","NaCl","CO"},
        {"John F. Kennedy", "Richard Nixon","James A. Garfield"},
        {"Canada","Denmark", "Greenland is an own state?"},
        {"12","20","14"},
        {"10","12","14"},
        {"not","never","now"},
        {"Leningrad","Wolgograd","Dimitrijgrad"}

};
private final String mQuestions[] = {
        "When was the European Union founded?",
        "How many Grad Celsius is one Kelvin?",
        "What is THC?",
        "How many legs has a spider?",
        "How many stars has the European flag?",
        "Which is the seventh planet from the sun?",
        "What is the chemical formula of salt?",
        "Who said: Ich bin ein berliner?",
        "To which country belongs Greenland?",
        "What is the result of: 2 + 2 *5?",
        "How many mountains are higher than 8000 meter/26.246 ft?",
        "A famous quote is: to be, or____ to be!",
        "What is the name of Stalingrad nowadays?"

};
private final String mCorrectAnswers[] = {
        "1993", "-272,15", "The active substance of marijuana",
        "8", "12","Uranus","NaCl","John F. Kennedy",
        "Denmark","12","14","not","Wolgograd"

};

private final List<Integer> indexes = new ArrayList<>();

public QuestionLibrary() {
    for (int i = 0; i < mQuestions.length; ++i)
        indexes.add(i);
}

private int index(int i) {
    return indexes.get(i);
}

public String getQuestion(int a) {
    return mQuestions[index(a)];
}

public String getChoice1(int a) {
    return mChoices[index(a)][0];
}

public String getChoice2(int a) {
    return mChoices[index(a)][1];
}

public String getChoice3(int a) {
    return mChoices[index(a)][2];
}

public String getCorrectAnswer(int a) {
    return mCorrectAnswers[index(a)];
}

public int getlength() {
    return mQuestions.length;
}

public void shuffle() {
    Collections.shuffle(indexes);
}
}

    package amapps.impossiblequiz;

    import android.content.Intent;
    import android.os.Bundle;
    import android.support.design.widget.NavigationView;
    import android.support.v4.widget.DrawerLayout;
    import android.support.v7.app.ActionBarDrawerToggle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;

    public class QuizActivity extends AppCompatActivity {


private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mToggle;
private Toolbar mToolbar;
private MenuItem menuItem;
private Intent in;

private QuestionLibrary mQuestionLibrary = new QuestionLibrary();

private TextView mScoreView;
private TextView mQuestionView;
private Button mButtonChoice1;
private Button mButtonChoice2;
private Button mButtonChoice3;

private String mAnswer;
private int mScore = 0;
private int mQuestionNumber = 0;






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

    QuestionLibrary q = new QuestionLibrary();
    System.out.printf("Question:0 Choice:(%s, %s, %s) Answer:%s%n",
            q.getChoice1(0), q.getChoice2(0), q.getChoice3(0), q.getCorrectAnswer(0));
    q.shuffle();
    System.out.printf("Question:0 Choice:(%s, %s, %s) Answer:%s%n",
            q.getChoice1(0), q.getChoice2(0), q.getChoice3(0), q.getCorrectAnswer(0));

    mToolbar = (Toolbar) findViewById(R.id.nav_action);

    setSupportActionBar(mToolbar);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);

    mToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.open, R.string.close);
    mDrawerLayout.addDrawerListener(mToggle);
    mToggle.syncState();
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); //Able to see the Navigation Burger "Button"


    NavigationView mNavigationView = (NavigationView) findViewById(R.id.nv1);
    mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener(){
        @Override
        public boolean onNavigationItemSelected(MenuItem menuItem){
            switch (menuItem.getItemId()){
                case(R.id.nav_stats):
                    Intent accountActivity = new Intent(getApplicationContext(),Menu2.class);
                    startActivity(accountActivity);
            }
            return true;
        }
    });



        mScoreView = (TextView) findViewById(R.id.score);
        mQuestionView = (TextView) findViewById(R.id.question);
        mButtonChoice1 = (Button) findViewById(R.id.choice1);
        mButtonChoice2 = (Button) findViewById(R.id.choice2);
        mButtonChoice3 = (Button) findViewById(R.id.choice3);


        updateQuestion();

        //Start of Button Listener1
        mButtonChoice1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //My logic for Button goes in here

                if (mButtonChoice1.getText() == mAnswer) {
                    mScore = mScore + 1;
                    updateScore(mScore);
                    updateQuestion();
                    mQuestionLibrary.shuffle();


                    //This line of code is optional...
                    Toast.makeText(QuizActivity.this, "Correct", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(QuizActivity.this, "Wrong... Try again!", Toast.LENGTH_SHORT).show();
                    mScore = 0;
                    updateScore(mScore);
                    updateQuestion();
                    mQuestionLibrary.shuffle();



                }
            }


        });
        //End of Button Listener1

        //Start of Button Listener2
        mButtonChoice2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //My logic for Button goes in here

                if (mButtonChoice2.getText() == mAnswer) {
                    mScore = mScore + 1;
                    updateScore(mScore);
                    updateQuestion();
                    mQuestionLibrary.shuffle();



                    //This line of code is optional...
                    Toast.makeText(QuizActivity.this, "Correct", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(QuizActivity.this, "Oh... wrong your score is 0", Toast.LENGTH_SHORT).show();
                    mScore = 0;
                    updateScore(mScore);
                    updateQuestion();
                    mQuestionLibrary.shuffle();



                }
            }


        });
        //End of Button Listener2

        //Start of Button Listener3
        mButtonChoice3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //My logic for Button goes in here

                if (mButtonChoice3.getText() == mAnswer) {
                    mScore = mScore + 1;
                    updateScore(mScore);
                    updateQuestion();
                    mQuestionLibrary.shuffle();



                    //This line of code is optional...
                    Toast.makeText(QuizActivity.this, "Correct", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(QuizActivity.this, "Come on, that was not so hard...", Toast.LENGTH_SHORT).show();
                    mScore = 0;
                    updateScore(mScore);
                    updateQuestion();
                    mQuestionLibrary.shuffle();



                }
            }


        });
        //End of Button Listener3

    }


private void updateQuestion() {

    if (mQuestionNumber < mQuestionLibrary.getlength()) {
        mQuestionView.setText(mQuestionLibrary.getQuestion(mQuestionNumber));
        mButtonChoice1.setText(mQuestionLibrary.getChoice1(mQuestionNumber));
        mButtonChoice2.setText(mQuestionLibrary.getChoice2(mQuestionNumber));
        mButtonChoice3.setText(mQuestionLibrary.getChoice3(mQuestionNumber));

        mAnswer = mQuestionLibrary.getCorrectAnswer(mQuestionNumber);
        mQuestionNumber++;
    } else Toast.makeText(QuizActivity.this, "Last Question!", Toast.LENGTH_SHORT).show();

}
private void updateScore(int point) {
    mScoreView.setText("" + mScore);

}


@Override //Makes that the "Burger" Item, shows the Drawer if someone clicks on the simbol
public boolean onOptionsItemSelected(MenuItem item) {
    if (mToggle.onOptionsItemSelected(item)) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}



}

【问题讨论】:

  • 我没有看到你在哪里选择随机问题,而是随机选择后将问题从列表中删除,并且只选择列表中的问题。
  • 看到很痛苦。为什么不将问题转化为对象?
  • 我从 QuestionLibrary (From the Array) 中挑选问题
  • 你为什么要改组 onClick?

标签: java android arrays collections


【解决方案1】:

我的理解是你想要的:

  1. “真正随机”的问题,
  2. 每个问题只问一次。

为了解决这个问题,我会:

  1. 引入一个新类Question,其中包含某个问题的问题、选择和正确答案。
  2. 使用这个类创建一个questions 的数组。
  3. 洗牌questions 的数组(考虑使用Fischer-Yates Shuffle 作为洗牌算法)。随机播放确保每个问题以随机顺序出现,与数组中包含的次数一样多。您想随机播放一次,然后继续第 4 步。李>
  4. 最后,只需遍历数组并逐个提问。

我更喜欢将问题结构化为 Question 类的对象,因为抽象使管理、讨论、扩展等变得更容易。

希望这会有所帮助。 :)


编辑

为了帮助指导您,这里有一些 Question 类的框架代码,您可以将其作为解决方案的基础:

public class Question {
    //public fields (aka variables) are accessed using "questionObject.field"
    public String question;
    public String[] choices;
    public String answer;

    public Question(String question, String[] choices, String answer){
        this.question = question;
        //TODO: the same for choices and answer
    }

    public boolean isCorrect(String userInput){
         //TODO: method that checks if answer is correct
    }
}

然后,在main方法中,创建一个数组:Question[] questions = {new Question(___,___,___), new Question(___,___,___) etcetc}

随机播放该数组(例如,使用 Fischer-Yates)。然后,最后,遍历数组并使用 for 循环一一处理问题。

希望这可以澄清事情:)

【讨论】:

  • 优秀答案 - 如果您希望它像一副纸牌一样工作,请像一副纸牌一样模拟它。
  • 您好,感谢您的回答...我是初学者,所以完全不明白...请您给我写代码吗?
  • 我在答案中添加了一些说明,请参阅编辑:)
猜你喜欢
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
相关资源
最近更新 更多