我正在执行的在线课程遇到问题。问题是:
给定整数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知识。
您可以将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);
[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);