如何删除列表中的一堆对象

时间:2011-01-11 21:53:34

标签: java list

没有其他我尝试的东西我似乎无法删除列表中的所有对象。 我总是最终删除了一半的物品,而另一半则因某种原因而停留。

非常感谢任何输入。

private List<Connection> listCon = new ArrayList<Connection>();

public void addConnection()
{    
        listCon.add(new Connection(isConnected)); 
}


public void inActivate() 
{
    for(int i=0; i < listCon.size(); i++)
    {
        removeConnection(listCon.get(i));
    }
}

public void removeConnection(Connection c)
{
    listCon.remove(c);
}

6 个答案:

答案 0 :(得分:7)

在迭代过程中从列表中删除对象的经典问题。

for(int i=0; i < listCon.size(); i++)
{
    removeConnection(listCon.get(i));
}

  • 删除对象0
  • 过去的对象1现在是对象0,过去的对象2现在是对象1
  • 删除对象1(之前的对象2)
  • 过去的对象2现在是对象1,过去对象3现在是对象2

许多解决方案。一个常见的是删除元素0直到大小为0.

编辑:如果您的目标只是在没有其他操作的情况下清除阵列,那么listCon.clear()是迄今为止更好的方法。我假设removeConnection不仅仅是从列表中删除元素,你只是没有证明这样做是为了让你的例子变得简单。

答案 1 :(得分:5)

在此方法中从列表中删除对象后,您正在更改“i”引用的内容:

public void inActivate() 
{
    for(int i=0; i < listCon.size(); i++)
    {
        removeConnection(listCon.get(i));
    }
}

相反,使用迭代器:

Iterator it = listCon.iterator(); 
while(it.hasNext())
{
    it.remove();
}

或在这种情况下,只需清除列表:

listCon.clear();

答案 2 :(得分:3)

您正在删除每一秒项,因为您在循环时正在更改列表。即你删除第0个元素,在这种情况下,第1个元素取代它,你移动到新的第1个元素等。 如果您使用调试器,您会看到这种情况发生。

最简单的方法是以相反的顺序删除元素,因为这不会导致元素被移动。

for(int i=listCon.size()-1; i>=0; i--)
    removeConnection(listCon.get(i));

答案 3 :(得分:2)

你正在改变数组结构,同时循环它,这是一个非常糟糕的主意,因为你经历过。因为一旦删除元素就会移动数组元素,您将跳过元素。

执行此操作的最佳方法是使用while循环:

while(listCon.size() > 0){
  listCont.remove(0);
}
@ebomike打败了我

答案 4 :(得分:2)

使用list .clear()方法怎么样?

如果你真的需要在迭代时逐步删除,你应该使用list迭代器及其remove()方法。

答案 5 :(得分:1)

为什么不使用listCon.clear()

如果做错了,请改变你的循环:

for(int i = listCon.size -1; i >=0; i--) { listCon.remove(i); }

或Will Kru建议,始终删除第0个元素

最后,使用迭代器和iterator.remove: for(Iterator<Connection> i = listCon.iterator(); i.hasNext();) { Connection c = i.next(); i.remove(); }