通常,在java中,要从堆栈(或集合)中删除项目,我会按照以下方式执行操作:
Stack<Particle> particles = new Stack<Particle>();
int i = 0, ;
while(i < particles.size()) {
if(particles.elementAt(i).isAlive()) {
i ++;
} else {
particles.remove(i);
}
}
我搜索了android文档并搜索了几次以试图获得相同的结果,但似乎没有任何效果。谁能在这帮助我?
答案 0 :(得分:2)
尝试使用Iterator
进行循环,因为每个Oracle 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 - 请参阅代码here),这对我有用。请注意,在此应用程序的代码中,我还包含了一个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);
}
}
}
这样,如果平台支持它,您将获得更有效的方法,如果不支持,您仍然可以使用备份。
答案 1 :(得分:-2)
你有没有试过这个:
Stack<String> stack = new Stack<String>();
stack.push("S");
stack.push("d");
for (String s : stack){
stack.pop();
}