从列表中删除条目?

时间:2011-11-03 03:59:34

标签: java list

假设你有一个支持删除函数的ArrayList的情况 - 它会删除该条目并将其右边的所有内容移到左边。

如果我想在某种情况下从列表中删除内容,我可能会这样做:

for (int i = 0; i < list.size(); i++) {
  if (condition) {
    list.remove(i);
    i--;
  }
}

但这很丑陋而且感觉很乱。您可以使用迭代器执行相同操作,但在使用迭代器时不应更改列表。

那么什么是非丑陋的解决方案?

4 个答案:

答案 0 :(得分:2)

迭代器实际上可以用于此目的,并且是Oracle documentation推荐的。

这是由Traversing Collections - Iterators:

下的上述链接提供的代码
static void filter(Collection<?> c) {
    for (Iterator<?> it = c.iterator(); it.hasNext(); )
        if (!cond(it.next()))
            it.remove();
}

最重要的是,在这个例子之上,他们说:

  

请注意,Iterator.remove是修改集合的唯一安全方法   在迭代期间;如果底层的行为是未指定的   在迭代进入时,以任何其他方式修改集合   进展。

答案 1 :(得分:1)

我只是使用一个循环,而是递减计数器

for(int i=list.size()-1; i>=0; --i) {
  if(condition) {
     list.remove(i);
  }
}

答案 2 :(得分:0)

试试这个

Iterator itr = list.iterator(); 
while(itr.hasNext()) {
if(condition)
    itr.remove();
} 

希望所以这个糟糕的工作..尝试别的ll建议另一个

我还有另一个为你检查条件......

int count=0;
Iterator itr = list.iterator(); 
while(itr.next()) {
count++;
if(condition=count)
    itr.remove();
} 

答案 3 :(得分:0)

Guava为Java提供了一些功能性的味道。 在你的情况下,它将是:

 FluentIterable.from(your_iterable).filter(new Predicate<Type_contained_in_your_iterable>()                    {
            @Override
            public boolean apply(@Nullable Type_contained_in_your_iterable input) {
                return {condition};
            }
        });

请注意,您的谓词只会返回满足条件的迭代中的元素。 这样清楚得多。不是吗。