0

とがCollection<A> caありCollection<B> cb、共通のインターフェイスは共有していませんが、それぞれに というプロパティがあります。で「対応する」値を持つ要素のみをフィルタリングして保持する必要があります。ABStringsomethingcacb

残念ながら、この質問/回答に従って共通のインターフェースAを作成することはオプションではありません。B

私は現在やっています

Iterator<A> it = ca.iterator();
while ( it.hasNext() ) {
    A a = it.next();
    if ( !cb.contains(new B(a.getSomething(), ... <known stuff>) )
        it.remove;
}

私が何をするかを知っているという事実を利用してB.equalsいます。これをパフォーマンスおよび/またはリソースに関して改善するためにできることはありますか?

4

3 に答える 3

1

新しいラッパー オブジェクトを作成することを考えられますか?

interface Holder {
    Object getThing(); //or a primative

class HolderA implements Holder {
    private A a;

    public HolderA(A _a) {
        a = _a;
    }

    public Object getThing() {
        return a.getSomething();
    }
}

class HolderB implements Holder {
    private B b;

    public HolderB(B _b) {
        b = _b;
    }

    public Object getThing() {
        return b.getSomething();
    }
}

この 2 つのオブジェクトを比較できるはずです。

于 2011-08-25T21:38:29.870 に答える
1

A と B をマップに入れ、文字列をキーにできますか? 次に、 Collection.retainAll() を数回使用できます。

Map<String, A> as = new HashMap<String, A>;
for (A a: ca) as.put(a.getSomething(), a);
Map<String, B> bs = new HashMap<String, B>;
for (B b: cb) bs.put(b.getSomething(), b);
as.keySet().retainAll(bs.keySet());
ca.retainAll(as.values());

少し怒っていますが、そこに行きます。

bs はSet<String>マップではなく a である可能性がありますが、対称性が気に入っています。

于 2011-08-25T23:19:52.767 に答える
0

Guava Collections2クラスをtransformfilterのように使用できます。

Collection<A> as = ...;
Collection<B> bs = ...;

final Collection<String> b_somethings = 
    Collections2.transform(
        bs, 
        new Function<B, String>() {
            public String apply(B input) {
                return input.getSomething();
            }   
        });

Collection<A> filtered_as = 
    Collections2.filter(
        as, 
        new Predicate<A>() {
            public boolean apply(A input) {
                return b_somethings.contains(input.getSomething());
            }
        });
于 2011-08-25T23:53:00.260 に答える