Java 是否存在允许另一个实例调用Iterable.remove()的Iterable?
是否有一种用于列表对象的Guava迭代器方法,允许在同一内存范围内存在两个迭代器实例,同时允许删除操作?奖励点:如果它对集合有效 示例用例:通过集合的外部和内部迭代,其中内部循环可能决定删除元素,而外部循环随后将跳过它 想象一下,使用Guava静态导入的以下概念代码将通过减少循环中要比较的元素数量以及消除在末尾从列表中删除空集的需要而受益:Java 是否存在允许另一个实例调用Iterable.remove()的Iterable?,java,collections,guava,Java,Collections,Guava,是否有一种用于列表对象的Guava迭代器方法,允许在同一内存范围内存在两个迭代器实例,同时允许删除操作?奖励点:如果它对集合有效 示例用例:通过集合的外部和内部迭代,其中内部循环可能决定删除元素,而外部循环随后将跳过它 想象一下,使用Guava静态导入的以下概念代码将通过减少循环中要比较的元素数量以及消除在末尾从列表中删除空集的需要而受益: private <T> Set<Set<T>> disjointify(Collection<Set<T&g
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已经存在,并且用于集合,那么用例将如下所示:我已经创建了我自己的非常低效的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();
}
}
}
}
为什么不直接过滤外部外观而不清空?因为过滤器是在迭代过程中计算的,所以任何新的空集合都不会在过滤列表/外部循环中返回
否则,我不这么认为。您将在outter循环中获得ConcurrentModificationException。为什么不直接过滤外部外观而不清空?因为过滤器是在迭代过程中计算的,所以任何新的空集合都不会在过滤列表/外部循环中返回
否则,我不这么认为。您将在outter循环中获得ConcurrentModificationException。标准库中似乎不存在这样的实现。标准库中似乎不存在这样的实现。这将导致算法中断,我将把测试用例留给读者-为什么呢由于空集在末尾被过滤掉,所以内部循环创建空集,外部循环可能永远不会再到达这些空集。这有点离题;-问题是关于Iterables,而不是其他编写示例用例的方法。这会导致算法崩溃,我将把测试用例留给读者-为什么呢由于空集在末尾被过滤掉,所以内部循环创建空集,外部循环可能永远不会再到达这些空集。这有点离题;-问题是关于Iterables,而不是编写示例用例的其他方法。