よく、それはtempList2
に表示するかどうかtempList
の各要素のremoveAll
チェックするため、実行時間が2つのリストのいずれかがない限りO(N^2)
を意味第二のリストのサイズを掛けた最初のリストの大きさに比例します非常に小さく、「一定のサイズ」と考えることができます。
一方、リストをあらかじめソートしてから、両方のリストを1回の繰り返しでマージソートのマージステップと同じように反復すると、並べ替えはO(NlogN)
となり、繰り返しはO(N)
となります。合計実行時間はO(NlogN)
です。ここではN
は2つのリストのうち大きい方のサイズです。
リストをソートされた構造体(おそらくTreeSet
)と置き換えることができる場合は、並べ替えを行う必要がないため、線形時間でremoveAll
を実装できます。
(tempList
とtempList2
ソートされているの両方を想定して)私はそれをテストしていませんが、このような何かが動作することができます:
Iterator<Integer> iter1 = tempList.iterator();
Iterator<Integer> iter2 = tempList2.iterator();
Integer current = null;
Integer current2 = null;
boolean advance = true;
while (iter1.hasNext() && iter2.hasNext()) {
if (advance) {
current = iter1.next();
advance = false;
}
if (current2 == null || current > current2) {
current2 = iter2.next();
}
if (current <= current2) {
advance = true;
if (current == current2)
iter1.remove();
}
}
tempList2をHashSetにすると、パフォーマンスが大幅に向上します。 –
あなたは最初に両方のリストをソートし、最初のもの(アイテムを削除しているもの)を単純に反復することを考えましたか?編集:基本的に@エランは以下のように提案した。 – ingenious
関連:* [コレクションへの洞察力removeAllメソッド](http://stackoverflow.com/questions/33227592/insight-into-collections-removeall-method)* – DaoWen