gpt4 book ai didi

java - arraylist remove 删除以下对象

转载 作者:行者123 更新时间:2023-12-03 19:51:21 26 4
gpt4 key购买 nike

我的代码中出现了一个非常奇怪的 Action 。我有以下类的 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;
}
}
}
}

remove 函数清除索引后面的所有内容。
例如:
如果这个 ArrayList 有 3 个元素,我调用 handler.remove(1) 它不仅会删除 1,还会删除第 2 行的对象。

最佳答案

我认为您的问题是您正在使用索引 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)。此操作是安全的,即使 map 中不存在 name 也是如此。此外,对于不关心名称的集合 handler 的当前使用,您可以通过调用检索 mySocket 的无序 Set map.values()。然后,您就可以使用上面的迭代器或 for-each 迭代该 Set

关于java - arraylist remove 删除以下对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20202168/

26 4 0