假设你有一个支持删除函数的ArrayList的情况 - 它会删除该条目并将其右边的所有内容移到左边。
如果我想在某种情况下从列表中删除内容,我可能会这样做:
for (int i = 0; i < list.size(); i++) {
if (condition) {
list.remove(i);
i--;
}
}
但这很丑陋而且感觉很乱。您可以使用迭代器执行相同操作,但在使用迭代器时不应更改列表。
那么什么是非丑陋的解决方案?
答案 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};
}
});
请注意,您的谓词只会返回满足条件的迭代中的元素。 这样清楚得多。不是吗。