Javaでは、のremoveAll()
およびretainAll()
メソッドを使用して、2つのコレクションオブジェクトの(set theoretic) differenceおよびintersectionを計算することができます。Javaコレクションの差または交差を計算するパフォーマンス
のJava 6のAbstractCollection classにおけるこれら2つの方法の実装は
public boolean removeAll(Collection<?> c) { // Difference
boolean modified = false;
Iterator<?> e = iterator();
while (e.hasNext()) {
if (c.contains(e.next())) {
e.remove();
modified = true;
}
}
return modified;
}
public boolean retainAll(Collection<?> c) { // Intersection
boolean modified = false;
Iterator<E> e = iterator();
while (e.hasNext()) {
if (!c.contains(e.next())) {
e.remove();
modified = true;
}
}
return modified;
}
が速く上記(明らかに高価な)動作を実現または実行する任意の方法はありますか?
は例えば、相違点や交差点を計算する前にコレクションを並べ替えから任意の全体的なパフォーマンスの向上があるだろうか?
これらの操作を使用するのに好適コレクションフレームワーク(パフォーマンスワイズ)のいずれかのクラスがありますか?
Hmmm ... rest()メソッドの実装は、同様にボトルネックになる可能性があります。 – PNS
はい、rest()を使用して毎回新しいリストを作成するのではなく、両方のリストにインデックスを保持することができます。 rest()を呼び出す代わりに、インデックスをインクリメントし、first()を比較する代わりに、インデックスの要素を比較します。 – Sjoerd