尝试使用 a 循环Iterator
,因为每个 Oracle是在迭代期间从 a (包括 a )中Iterator.remove()
删除项目的唯一安全方法。Collection
Stack
来自http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html
请注意, Iterator.remove 是在迭代期间修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改了基础集合,则行为未指定。
所以像下面这样的东西应该可以工作:
Stack<Particle> particles = new Stack<Particle>();
... // Add a bunch of particles
Iterator<Particle> iter = particles.iterator();
while (iter.hasNext()) {
Particle p = iter.next();
if (!p.isAlive()) {
iter.remove();
}
}
我在一个真正的 Android 应用程序(OneBusAway Android - 请参阅此处的代码)中使用了这种方法,它对我有用。请注意,在此应用程序的代码中,我还包含了一个 try/catch 块,以防平台引发异常,在这种情况下,只需遍历集合的副本,然后从原始集合中删除该项目。
对你来说,这看起来像:
try {
... // above code using iterator.remove
} catch(UnsupportedOperationException e) {
Log.w(TAG, "Problem removing from stack using iterator: " + e);
// The platform apparently didn't like the efficient way to do this, so we'll just
// loop through a copy and remove what we don't want from the original
ArrayList<Particle> copy = new ArrayList<Particle>(particles);
for (Particle p : copy) {
if (!p.isAlive()) {
particles.remove(p);
}
}
}
这样,如果平台支持,您将获得更有效的方法,如果不支持,您仍然有备份。