2

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();
            }
        }
    }
}
4

2 に答える 2

0

そのような実装は標準ライブラリには存在しないように思われます。

于 2012-07-12T16:56:11.330 に答える
-1

NO_EMPTIES で外側の外観をフィルタリングしないのはなぜですか? フィルターは反復中に評価されるため、フィルター処理されたリスト/外側のループでは、新しく空のセットは返されません。

そうでなければ、そうは思いません。ConcurrentModificationException外側のループを取得します。

于 2012-05-17T11:09:07.793 に答える