是否存在List对象的Guava迭代器(或方法),它允许两个迭代器实例存在 - 在同一内存范围内 - 同时允许remove()操作? (奖励点:如果它适用于收藏品)。
示例用例:通过集合的外部和内部迭代,其中内部循环可能决定删除元素,外部循环随后将跳过它。
想象一下,如何通过减少循环中要比较的元素数量,以及在末尾从列表中删除空集的需要,如何使以下概念代码(使用Guava静态导入)受益:
private <T> Set<Set<T>> disjointify(Collection<Set<T>> sets) {
List<Set<T>> disjoint = newArrayList(sets);
for (Set<T> set1 : disjoint) {
for (Set<T> set2 : filter(disjoint, not(equalTo(set1)))) {
if (!intersection(set1, set2).isEmpty()) {
// this wouldn't be safe for a Set<Set<T>>
set1.addAll(set2);
set2.clear();
}
}
}
return newHashSet(filter(disjoint, NO_EMPTIES));
}
private static final Predicate<Set<?>> NO_EMPTIES = new Predicate<Set<?>>() {
@Override
public boolean apply(Set<?> input) {
if (input == null || input.isEmpty()) {
return false;
}
return true;
}
};
注意:人们很容易想象创建实现 - 特别是对于LinkedList - 我只是问这里是否已存在。
对于记录,如果一个有效的Iterable已经存在,并且为Sets工作,那么用例将如下所示(我已经创建了我自己的非常低效的Iterable来实现这一点,但是它长达50行而且很荒谬低效 - 所以我使用上面的原始代码):
private <T> void disjointify(Set<Set<T>> sets) {
for (Set<T> set1 : nestable(sets)) {
Iterator<Set<T>> it = filter(nestable(sets), not(equalTo(set1))).iterator();
while (it.hasNext()) {
Set<T> set2 = it.next();
if (!intersection(set1, set2).isEmpty()) {
set1.addAll(set2);
it.remove();
}
}
}
}
答案 0 :(得分:0)
标准库中似乎不存在这样的实现。
答案 1 :(得分:-1)
为什么不用NO_EMPTIES过滤外观?由于在迭代期间评估过滤器,因此在过滤的列表/外部循环中不会返回任何新的空集。
否则,我不这么认为。您将在外部循环中获得ConcurrentModificationException
。