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

问题描述 投票:0回答:3

我正在执行的在线课程遇到问题。问题是:

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

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

java arraylist indexoutofboundsexception
3个回答
0
投票

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

或您可以使用Iterator从列表中删除

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


0
投票

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

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

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

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


0
投票

希望下面满足您的要求。

        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);
© www.soinside.com 2019 - 2024. All rights reserved.