【问题标题】:How to check if a number is between a range如何检查一个数字是否在一个范围内
【发布时间】:2019-12-25 05:05:46
【问题描述】:

我正在做的在线课程有问题。问题是:

给定一个整数 x,编写一个程序,生成 x 和 0 之间的随机数,直到该范围内的每个数字至少生成一次。生成此范围内的所有数字后,程序应显示生成的数字。

我编写了一个程序,我认为它可以解决这个问题,但是在检查数字是否在范围内时遇到了问题。到目前为止,这是我的代码:

    public static void main(String[] args) {
        Random generator = new Random();
        ArrayList<Integer> range = new ArrayList<Integer>();
        ArrayList<Integer> generated = new ArrayList<Integer>();

        int x = 10;
        int count = 0;

        for(int i = 0; i<x+1; i++){
            range.add(i);
        }

        while(range.isEmpty() != true){
            int temp = generator.nextInt(x-1);
            count++;
            generated.add(temp);
            if(range.contains(temp)){
                range.remove(temp);
            }
        }
    }
}

我的想法是首先创建两个数组列表。第一个将包含 0 和给定 x 之间的所有数字。第二个将包含生成的随机数。然后我用 0 到 x 之间的范围填充范围数组列表。然后我的 While 循环检查此范围列表以查看它是否为空。如果没有,它会生成一个随机数,将其添加到我的第二个数组列表中。然后我检查这个数字是否在数组列表范围内 - 如果是,它会删除它并继续。我遇到的问题是它在几次运行后遇到了 IndexOutOfBoundsException。我认为这是因为我正在从数组列表中删除生成的数字。谁能帮我解决这个问题

编辑:我不能使用任何集合或其他 API。这部分课程主要是关于使用数组和循环等,而不是高级 Java 的东西。

【问题讨论】:

  • setset1 未声明
  • @njzk2 抱歉,名称仍然在代码中设置和设置1,但应该是范围和生成的,我现在将更改它
  • 真实代码中使用List&lt;Integer&gt; range = IntStream.rangeClosed(0, x).boxed().collect(Collectors.toList()); Collections.shuffle(range, generator); System.out.println(range);
  • @ElliottFrisch 分配不是随机排列数字,而是不断生成随机数,直到生成范围内的所有数字。例如。对于 0-3 范围内的数字,您可能会得到 2,0,2,3,3,2,0,1 作为结果。
  • 并且提示:当你必须从 0 到 n 中创建 n 个随机数时,则没有随机数。这里唯一随机的就是顺序。您也可以只创建一个包含所有数字的数组,然后打乱数组。

标签: java arraylist indexoutofboundsexception


【解决方案1】:

remove 是一个重载方法,remove(int) 删除指定索引处的项目,remove(T) 删除列表中与您传入的参数相等的第一个对象

由于您将 int 传递给方法而不是 Integer,因此选择第一个方法

对代码最简单的修改是将range.remove(temp); 替换为range.remove(range.indexOf(temp));range.remove((Integer)temp)

你也必须调用generator.nextInt(x+1);,否则程序将陷入无限循环

【讨论】:

    【解决方案2】:

    您可以将 range.remove(temp); 替换为 range.removeIf(t -> t == temp);

    Random generator = new Random();
            ArrayList<Integer> range = new ArrayList<Integer>();
            ArrayList<Integer> generated = new ArrayList<Integer>();
    
            int x = 10;
            int count = 0;
    
            for(int i = 0; i<x+1; i++){
                range.add(i);
            }
    
            while(range.isEmpty() != true){
                int temp = generator.nextInt(x-1);
                count++;
                generated.add(temp);
                if(range.contains(temp)){
                    range.removeIf(t -> t == temp);
                }
            }
    

    或者您可以使用迭代器从列表中删除

    for (Iterator<Integer> it = range.iterator(); it.hasNext(); ) {
                    Integer obj= it.next();
                    if (obj == temp) {
                        // Remove the current element from the iterator and the list.
                        it.remove();
                        break;
                    }
                }
    

    您的逻辑中的另一个问题
    int temp = generator.nextInt(x-1);您生成的随机数不包含所有数字。它应该是 int temp = generator.nextInt(x+2);

    【讨论】:

    【解决方案3】:

    希望以下内容能满足您的要求。

            Random random = new Random();
            int x = 3;
            List<Integer> range = new ArrayList<>();
            for(int i = 0; i <x+1; i++) {
                range.add(i);
            }
            List<Integer> list = new ArrayList<>();
            while (!list.containsAll(range)) {
                list.add(random.nextInt(x + 1));
            }
            System.out.println(list);
    

    【讨论】:

      最近更新 更多