Javafx 2 可观测误差

Javafx 2 可观测误差,javafx-2,Javafx 2,我制作了一个程序,可以产生6个介于1和41之间的随机数。在UI中,我有6个文本字段和一个按钮。如果我按下按钮,文本字段中将显示6个数字。我有一个函数(theNumbers())在按下按钮时启动,第一个函数用数字1-41创建一个可观察列表,第二个函数随机选择6个数字 出现的问题是,按下按钮几次后,会引发ArrayIndexOutofBound异常:-1,通常在生成数字0(甚至不在列表中)之后(或几次之后),有时还会引发IndexOutOfBoundsException:Index:4,Size:4

我制作了一个程序,可以产生6个介于1和41之间的随机数。在UI中,我有6个文本字段和一个按钮。如果我按下按钮,文本字段中将显示6个数字。我有一个函数(theNumbers())在按下按钮时启动,第一个函数用数字1-41创建一个可观察列表,第二个函数随机选择6个数字

出现的问题是,按下按钮几次后,会引发ArrayIndexOutofBound异常:-1,通常在生成数字0(甚至不在列表中)之后(或几次之后),有时还会引发IndexOutOfBoundsException:Index:4,Size:4异常(顺便说一句,该数字是随机的)。此外,它似乎能够产生两倍于相同数字或大于41的数字

这是我的代码:

第一个功能:

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这是真的,它可以保存从列表中删除带有索引的值吗?