remove()操作を許可しながら、2つのイテレーターインスタンスが(同じメモリスコープ内に)存在できるようにするListオブジェクト用のGuavaイテレーター(または方法論)はありますか?(ボーナスポイント:コレクションで機能する場合)。
ユースケースの例:コレクションを介した外部および内部の反復。内部ループが要素を削除することを決定し、外部ループがその後それをスキップする場合があります。
ループ内で比較する要素の数を減らし、最後にリストから空のセットを削除する必要をなくすことで、次のコンセプトコード(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();
}
}
}
}