LinkedLists:无限循环

4 java list

为什么以下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],并删除01前两次.现在你有[2, 3],其大小为2,所以你3现在永远不会删除!

比如说要按位置而不是价值去除fields.remove(f).(注意,它f是一个整数,(Integer)f而是列表容器中包含的类型的对象.)

(另外,对于不同的行为,您可以继续通过值删除,但你现在应该从范围得出的随机数[min, max],在那里你必须分别确定列表元素的极值.这可能需要很多的时间越长,当然,因为你会有很多"未命中",你不会删除任何东西.)


Sea*_*oyd 5

因为这条线:

fields.remove((Integer) f);
Run Code Online (Sandbox Code Playgroud)

删除(Integer)演员,它应该工作.

列表中有两种删除方式:

  • 按位置删除:remove(int)
  • 按内容删除:( remove(E)实际上是remove(Object)出于兼容性原因)

在你的情况下,E是整数,并且由于自动装箱,你可以将int转换为整数.通过这样做,您选择第二种类型,而您想要第一种类型.

  • 史诗自动装箱失败.: - { (4认同)
  • @Kirk这不是关于两个不同的整数,这是关于重载方法的int vs Integer. (2认同)