0

我需要做这样的事情......

Collection<T> myCollection; ///assume it is initialized and filled


for(Iterator<?> index = myCollection.iterator(); index.hasNext();)
{
    Object item = index.next();
    myCollection.remove(item);
}

显然这会抛出 ConcurrentModificationException ...

所以我已经尝试过了,但看起来并不优雅/高效,并引发了 Type safety: Unchecked cast from Object to T 警告

Object[] list = myCollection.toArray();
for(int index = list.length - 1; index >= 0; index--) {
 myCollection.remove((T)list[index]);
}
4

2 回答 2

6

您可以使用iterator.remove()

for(Iterator<?> index = myCollection.iterator(); index.hasNext();)
{
    Object item = index.next();
    index.remove();
}

请注意,这可能会导致O(n^2)某些数据类型(例如ArrayList)的运行时间。在这种特殊情况下,在迭代之后简单地清除集合可能更有效。

于 2010-01-13T03:32:43.367 回答
0

附带说明一下,在这种情况下,原始集合的类型也很重要。例如,Arrays.asList(new Integer[]{1, 2, 3});奇怪地创建了一个UnmodifiableList,在这种情况下,您需要实例化一个空的 ArrayList perform newList.addAll(Arrays.asList(new Integer[]{1, 2, 3});

于 2010-01-13T05:10:35.160 回答