没有其他我尝试的东西我似乎无法删除列表中的所有对象。 我总是最终删除了一半的物品,而另一半则因某种原因而停留。
非常感谢任何输入。
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);
}
答案 0 :(得分:7)
在迭代过程中从列表中删除对象的经典问题。
for(int i=0; i < listCon.size(); i++)
{
removeConnection(listCon.get(i));
}
您
许多解决方案。一个常见的是删除元素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();
}