我的代码中有一个非常奇怪的动作。我有以下课程的ArrayList
。
class mySocket
{
public String name;
public Socket sck;
public mySocket(String n,Socket s)
{
this.name=n;
this.sck=s;
}
}
我声明像这样的对象
ArrayList<mySocket> handler = new ArrayList<>();
现在的问题是,当我尝试使用此方法删除项目时:
public void removeByName(String name)
{
synchronized(this)
{
mySocket t;
int i;
for(i=0;i<handler.size();i++)
{
t=handler.get(i);
if((t.name.equals(name)))
{
handler.remove(i);
break;
}
}
}
}
删除功能会清除索引后面的所有内容
例如:
如果此ArrayList
有3个元素并且我调用handler.remove(1)
,它不仅会删除1,还会删除第2行上的对象。
答案 0 :(得分:0)
我认为您的问题是您正在使用索引for循环并按索引删除。在您的示例中,如果您的列表包含3个元素并且您删除索引1,则索引2处 的对象仍然存在。它刚刚在索引1处。
更好的方法是尝试使用迭代器或for-each循环。
//code outside for loop the same
for( mySocket socket : handler ) {
if((socket.name.equals(name)))
{
handler.remove(socket);
break;
}
}
mySocket
个对象的排序是否重要?如果没有,将它们存储在Map
按名称键入将为您省去一些麻烦。然后你只需拨打handler.remove(name)
。即使地图中不存在name
,此操作也是安全的。此外,对于不关心名称的集合handler
的当前使用,您可以通过调用Set
来检索mySocket
的无序map.values()
。然后,您可以使用迭代器或上面的for-each迭代Set
。
答案 1 :(得分:0)
在循环播放时,您无法删除集合中的项目,结果如您所见,未定义。
您必须构建要删除的项目列表并使用
originalList.removeAll(itemsToBeRemoved);
或者使用迭代器构建循环。
Iterator<mySocket> handlerIterator = handler.iterator();
while (handlerIterator.hasNext()) {
mySocket t = handlerIterator.next();
if (t.name.equals(name)) {
handlerIterator.remove();
}
}