为什么以下java代码导致无限循环?
import java.util.LinkedList;
import java.util.Random;
public class Main {
public static void main(String[] args) {
int n = 3;
Random rand = new Random();
LinkedList<Integer> fields = new LinkedList<Integer>();
for (int i = 0; i < n*n; i++) {
fields.add(i);
}
while (fields.size() > 0) {
// Choose Field
int f = rand.nextInt(fields.size());
fields.remove((Integer) f);
System.out.println(fields.size());
}
}
}
Run Code Online (Sandbox Code Playgroud)
Ker*_* SB 11
您使用的方式是remove按值而不是按位置删除对象.
说你的列表包括价值观[0, 1, 2, 3],并删除0与1前两次.现在你有[2, 3],其大小为2,所以你3现在永远不会删除!
比如说要按位置而不是价值去除fields.remove(f).(注意,它f是一个整数,(Integer)f而是列表容器中包含的类型的对象.)
(另外,对于不同的行为,您可以继续通过值删除,但你现在应该从范围得出的随机数[min, max],在那里你必须分别确定列表元素的极值.这可能需要很多的时间越长,当然,因为你会有很多"未命中",你不会删除任何东西.)
因为这条线:
fields.remove((Integer) f);
Run Code Online (Sandbox Code Playgroud)
删除(Integer)演员,它应该工作.
列表中有两种删除方式:
remove(int)和remove(E)实际上是remove(Object)出于兼容性原因)在你的情况下,E是整数,并且由于自动装箱,你可以将int转换为整数.通过这样做,您选择第二种类型,而您想要第一种类型.
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |