如何检查一个数字是否在一个范围内

How to check if a number is between a range

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

给定一个整数 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 之间的范围填充范围 arraylist。然后我的 While 循环检查这个范围列表看它是否为空。如果没有,它会生成一个随机数,并将其添加到我的第二个数组列表中。然后我检查这个数字是否在 arraylist 范围内——如果是,则将其删除并继续。我遇到的问题是 运行 进入 IndexOutOfBoundsException 几次后。我认为这是因为我正在从 arraylist 中删除生成的数字。谁能帮我解决这个问题

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

您可以将 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);

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

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

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

另外你必须调用generator.nextInt(x+1);否则程序会陷入死循环

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

        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);