是否有Iterable允许Iterable.remove()被另一个实例调用?

时间:2012-05-17 10:58:37

标签: java collections guava

是否存在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();
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

标准库中似乎不存在这样的实现。

答案 1 :(得分:-1)

为什么不用NO_EMPTIES过滤外观?由于在迭代期间评估过滤器,因此在过滤的列表/外部循环中不会返回任何新的空集。

否则,我不这么认为。您将在外部循环中获得ConcurrentModificationException