Javafx 2 可观测误差
我制作了一个程序,可以产生6个介于1和41之间的随机数。在UI中,我有6个文本字段和一个按钮。如果我按下按钮,文本字段中将显示6个数字。我有一个函数(theNumbers())在按下按钮时启动,第一个函数用数字1-41创建一个可观察列表,第二个函数随机选择6个数字 出现的问题是,按下按钮几次后,会引发ArrayIndexOutofBound异常:-1,通常在生成数字0(甚至不在列表中)之后(或几次之后),有时还会引发IndexOutOfBoundsException:Index:4,Size:4异常(顺便说一句,该数字是随机的)。此外,它似乎能够产生两倍于相同数字或大于41的数字 这是我的代码: 第一个功能:Javafx 2 可观测误差,javafx-2,Javafx 2,我制作了一个程序,可以产生6个介于1和41之间的随机数。在UI中,我有6个文本字段和一个按钮。如果我按下按钮,文本字段中将显示6个数字。我有一个函数(theNumbers())在按下按钮时启动,第一个函数用数字1-41创建一个可观察列表,第二个函数随机选择6个数字 出现的问题是,按下按钮几次后,会引发ArrayIndexOutofBound异常:-1,通常在生成数字0(甚至不在列表中)之后(或几次之后),有时还会引发IndexOutOfBoundsException:Index:4,Size:4
ObservableList<Integer> list1 = FXCollections.observableArrayList();
private void createList(ObservableList<Integer> list1) {
this.list1 = list1;
int numbers = 41;
for (int i = 1; i <= numbers; i++) {
list1.add(i);
}
}
private void theNumbers() {
createList(list1);
ObservableList<Integer> finalNums = FXCollections.observableArrayList();
try {
for (int i = 0; i < 6; i++) {
FXCollections.shuffle(list1);
int lucky = new Random().nextInt(list1.size());
finalNums.add(lucky);
list1.remove(list1.indexOf(lucky));
}
} catch (Exception ex) {
throw ex;
}
FXCollections.sort(finalNums);
textField1.setText(finalNums.get(0).toString());
textField2.setText(finalNums.get(1).toString());
textField3.setText(finalNums.get(2).toString());
textField4.setText(finalNums.get(3).toString());
textField5.setText(finalNums.get(4).toString());
textField6.setText(finalNums.get(5).toString());
list1.clear();
finalNums.clear();
}
observeList1=FXCollections.observearraylist();
私有void createList(可观察列表列表1){
this.list1=list1;
整数=41;
对于(inti=1;i尝试使用
int lucky = new Random().nextInt(list1.size()-1);
您的代码尝试在for构造的一次过程中删除两次或更多完全相同的数字。例如,您不能从列表中多次删除数字“2”。indexOf(2)
方法将返回-1,因为它在列表中再也找不到值2
因此,在尝试从列表1中删除之前,您可以检查列表1中是否仍然存在一个数字
private void theNumbers() {
createList(list1);
ObservableList<Integer> finalNums = FXCollections.observableArrayList();
try {
for (int i = 0; i < 6; i++) {
FXCollections.shuffle(list1);
int lucky;
do
{
lucky= new Random().nextInt(list1.size());
}while(list1.indexOf(lucky) == -1);
finalNums.add(lucky);
list1.remove(list1.indexOf(lucky));
}
} catch (Exception ex) {
throw ex;
}
private void theNumbers(){
createList(列表1);
ObservableList finalNums=FXCollections.observableArrayList();
试一试{
对于(int i=0;i<6;i++){
FXCollections.shuffle(列表1);
int幸运;
做
{
lucky=new Random().nextInt(list1.size());
}而(列表1.indexOf(lucky)=-1);
最后加上(幸运);
列表1.删除(列表1.indexOf(lucky));
}
}捕获(例外情况除外){
掷骰子;
}
这应该可以解决您的问题。list.size()是41,一个数字数组[0]1-[40]41,在调用list1.remove(indexof(lucky))时更新为40。它正在工作。:)很抱歉,我不明白,但是它如何能够在第二次选择相同的数字两次或0,而第二次该数字甚至不在列表中?我使用了一个断点,逐行遍历代码。它选择的第二个数字是34,然后在list.size为37的情况下,它再次选择第四个数字34。我查看了内容在它想要删除34之前,它不存在,当然它会抛出一个arrayindexoutofbounds异常:-1.我在这里缺少什么?除了do/while循环,或者可能就是这样。行int lucky=new Random().nextInt(list1.size())
选择一个介于0和list1.size-1之间的随机数。该范围的上限会随着每次循环的进行而减小。但这并不妨碍随机数生成器多次选择相同的数字(如果该数字小于list1.size-amount-loop-1),因此随机数不会选择一个数字,而是选择一个索引,如list1[30]使用它持有的值。一旦选择了它不再是列表的一部分,那么索引将是list1[-1]值10。使用do/while循环,说while(list1.indexof(lucky)=-1这是真的,它可以保存从列表中删除带有索引的值吗?