当前位置:  开发笔记 > 编程语言 > 正文

Java:如何在迭代/添加元素时从列表中删除元素

如何解决《Java:如何在迭代/添加元素时从列表中删除元素》经验,为你挑选了2个好方法。

这个问题是在描述(和解决)问题的一个比较特殊的情况下这个问题.

我有两个方法,stopAndRemove(ServerObject服务器)和close()方法.后者应关闭所有服务器并将其从服务器列表中删除.该列表定义为

List server. 

我不想在closeCurrentlyOpen中使用stopAndRemove中的几乎相同的代码,所以我想做类似的事情:

public void closeCurrentlyOpen() {
   for(ServerObject server : this.servers) {
       stopAndRemove(server)
   }
}

这将不起作用,因为这将导致ConcurrentModificationException.我试着复制一份清单

List copyList = new ArrayList(this.servers);

并将其用作foreach循环的列表.但是当我在copyList上迭代时,另一个线程可能会将服务器附加到服务器列表,但closeCurrentlyOpen应该会产生一个emtpy列表.当addServerToList方法同步到servers-list时,执行此操作

public void closeCurrentlyOpen() {
   synchronized(this.servers) {
     for(ServerObject server : this.servers) {
        stopAndRemove(server)
     }
    }
}

将通过修改解决问题.但是我不能在stopAndRemove方法中同步代码,如果直接调用它是必需的.

在我看来,这三种方法的设计可能需要修改.任何人的想法?



1> starblue..:

从stopAndRemove()拆分方法stop().然后使用显式迭代器编写循环,执行stop,然后使用iterator.remove().

方法名称中的"和"是代码气味.



2> Bob Gettys..:

也许这是错误的方法,但我总是创建一个删除集合,其中包含对需要删除的对象的索引或引用.然后我遍历该集合并从原始集合中删除这些索引/对象.可能不是最有效的,但它完成了工作.

代替

for(Collection things : thing)  
    things.remove(thing)

我用

Collection toRemove = new LinkedList();
for(things : thing)
    toRemove.add(thing);

for(toRemove : thing)
    things.remove(thing)


势在必行*对不起,我帮不了它:(
推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有