在android中删除堆栈中的项目,同时迭代它

时间:2013-09-27 02:28:42

标签: java android stack

通常,在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文档并搜索了几次以试图获得相同的结果,但似乎没有任何效果。谁能在这帮助我?

2 个答案:

答案 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();
}