1

通常,在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 文档并在 Google 上搜索了很多次,试图获得相同的结果,但似乎没有任何效果。有人能帮我一下吗?

4

2 回答 2

2

尝试使用 a 循环Iterator,因为每个 Oracle是在迭代期间从 a (包括 a )中Iterator.remove()删除项目的唯一安全方法。CollectionStack

来自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);                
        }
    }
}

这样,如果平台支持,您将获得更有效的方法,如果不支持,您仍然有备份。

于 2013-09-27T03:23:53.680 回答
-2

你有没有试过这个:

Stack<String> stack = new Stack<String>();
stack.push("S");
stack.push("d");
for (String s : stack){
     stack.pop();
}
于 2013-09-27T02:43:59.903 回答