Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 获取数组中的随机问题而不重复问题_Android_Arrays_Random - Fatal编程技术网

Android 获取数组中的随机问题而不重复问题

Android 获取数组中的随机问题而不重复问题,android,arrays,random,Android,Arrays,Random,我是一个编程新手,我正在尝试在测验中生成随机问题。我可以确定问题是随机的,但问题仍然在重复。我怎样才能防止它们复制?我已经看过好几篇文章,但我不太明白如何实现代码 这是我存储和显示问题的主要活动: public class MainActivity extends AppCompatActivity { private TextView textView; private Button generateQbutton; private boolean aBoolean; @Override p

我是一个编程新手,我正在尝试在测验中生成随机问题。我可以确定问题是随机的,但问题仍然在重复。我怎样才能防止它们复制?我已经看过好几篇文章,但我不太明白如何实现代码

这是我存储和显示问题的主要活动:

public class MainActivity extends AppCompatActivity {
private TextView textView;
private Button generateQbutton;
private boolean aBoolean;

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

    textView = (TextView) findViewById(R.id.textV);
    generateQbutton = (Button) findViewById(R.id.buttonP);

    randomFacts ();

    generateQbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder altdial = new AlertDialog.Builder(MainActivity.this);
            altdial.setMessage(factArray[0].getmDialog()).setPositiveButton("k", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            });
            AlertDialog ctnalert =  altdial.create();
            ctnalert.show();

            randomFacts ();

        }
    });

}
public void randomFacts (){
    shuffelFacts ();
    textView.setText(factArray[0].getmFacts());
    aBoolean = factArray[0].ismAnswers();

}
Facts f01 = new Facts(true, "Quesstion1?", "Dialog for Q1!");
Facts f02 = new Facts(false, "Quesstion2??", "Dialog for Q2!");
Facts f03 = new Facts(true, "Quesstion3??", "Dialog for Q3!");
Facts f04 = new Facts(false, "Quesstion4??", "Dialog for Q4!");
Facts f05 = new Facts(true, "Quesstion5?", "Dialog for Q5!");


Facts [] factArray = new Facts[]{
        f01,f02,f03,f04,f05,
};
public void shuffelFacts(){
    Collections.shuffle(Arrays.asList(factArray));
}
}
这是我的构造器:

public class Facts {
private boolean mAnswers;
private String mFacts;
private String mDialog;

public Facts(boolean mAnswers, String mFacts, String mDialog) {
    this.mAnswers = mAnswers;
    this.mDialog = mDialog;
    this.mFacts = mFacts;
}

public boolean ismAnswers() {
    return mAnswers;
}

public String getmFacts() {
    return mFacts;
}
public String getmDialog(){
    return mDialog;
}
}

您可以定义一个
列表
来保存您的事实,确保将此列表而不是数组洗牌,最后,每次使用时删除一个事实

大概是这样的:

List<Facts> factsList = Arrays.asList(factArray);

public void randomFacts (){
    shuffelFacts (); //shuffles the list instead of the array
    if (factsList.isEmpty()) return; //make sure there're more items
    Facts facts = factsList.remove(0);
    textView.setText(facts);
    aBoolean = facts.ismAnswers();
}
List factsList=Arrays.asList(factArray);
公共事实(){
shuffelFacts();//洗牌列表而不是数组
if(factsList.isEmpty())return;//确保还有更多项
事实=事实列表。删除(0);
textView.setText(事实);
aBoolean=facts.ismAnswers();
}
回答问题后,您将其设置为
setisAnswered(true)
当你们洗牌列表并选择另一个答案时,你们只会选择那个些目前还并没有回答的答案

if(!facts.isAnswered()){
textView.setText(facts.getmFacts());

}

您在提出问题后将其从列表中删除。当列表为空时,提问的所有问题和测验结束。因此,最好使用一个简单的ArrayList,并使用Random类在运行时选择当前元素上的问题。您可以按照@HenningLuther的建议进行操作,也可以将已回答的问题移动到另一个列表中以供已完成/已回答的问题参考。将数组无序排列,然后按顺序阅读
public void randomFacts (){
    shuffelFacts ();
    for (Facts facts : factArray) {
        if (!facts.isAnswered()){
            textView.setText(facts.getmFacts());
            facts.setisAnswered(true);
            return;
        }
    }

}