繁体   English   中英

从列表中删除条目?

[英]Removing entries from a list?

假设您拥有一个支持remove函数的ArrayList -删除该条目并将所有内容向右移到左边。

如果要在特定条件下从列表中删除内容,可以执行以下操作:

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

但这是丑陋的,让人觉得有点黑。 您可以使用Iterator进行相同的操作,但在使用Iterator时不应更改列表。

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

实际上,迭代器可用于此目的,这是Oracle文档建议的。

这是上面的链接在遍历集合-迭代器下提供的代码:

static void filter(Collection<?> c) {
    for (Iterator<?> it = c.iterator(); it.hasNext(); )
        if (!cond(it.next()))
            it.remove();
}

最重要的是,在该示例之上,他们说:

注意, Iterator.remove是在迭代过程中修改集合的唯一安全方法。 如果在进行迭代时以任何其他方式修改了基础集合,则行为未指定。

我只是使用循环,而是减少计数器

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

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

请注意,谓词只会返回满足您条件的可迭代元素。 这样更加清晰。 是不是

尝试这个

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

希望如此工作能顺利进行..否则会建议另一个

我还有另一个要检查的状况。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM