から珍しい要素を削除するにはどうすればよいArrayList
ですか? シナリオは、 と の 2 つのArrayList
オブジェクトがarr1
ありarr2
ます。arr2
のほぼすべての要素が含まれていますarr1
。arr1
にない要素を から削除したいと思いarr2
ます。
どうすればこれを達成できますか? ArrayList
2 つのオブジェクト間の一般的でない要素を削除する方法または手法はありますか?
から珍しい要素を削除するにはどうすればよいArrayList
ですか? シナリオは、 と の 2 つのArrayList
オブジェクトがarr1
ありarr2
ます。arr2
のほぼすべての要素が含まれていますarr1
。arr1
にない要素を から削除したいと思いarr2
ます。
どうすればこれを達成できますか? ArrayList
2 つのオブジェクト間の一般的でない要素を削除する方法または手法はありますか?
使用CollectionUtils.retainAll
:collection2にもあるcollection1のすべての要素を含むコレクションを返します。
ArrayList commonList = CollectionUtils.retainAll(list1,list2);
次に、forループで一般的でない要素を削除します
retainAll
ArrayListに実装されているメソッドを使用できます。集合交差点のようなものです。
どうarr1.retainAll(arr2);
ですか?
方法 1:
arr1.retainAll(arr2)
方法 2:
List<String> arr1;
List<String> arr2 ;
for(String s: arr2){
if(arr1.contains(s))
arr1.remove(s);
}
個人的には、表現力とパフォーマンス効率が高い 1 の方が優れていると感じています。arr1 が arr2 と等しくない場合、JDK は、個々の要素を削除するのではなく、完全にSystem.arraycopy()
コピーするために使用します。System.arraycopy はネイティブに実装されており、非常に高速です。arr2
arr1
以下は、これを行うJDKコードへの参照です。
private boolean batchRemove(Collection<?> c, boolean complement) {
final Object[] elementData = this.elementData;
int r = 0, w = 0;
boolean modified = false;
try {
for (; r < size; r++)
if (c.contains(elementData[r]) == complement)
elementData[w++] = elementData[r];
} finally {
// Preserve behavioral compatibility with AbstractCollection,
// even if c.contains() throws.
if (r != size) {
System.arraycopy(elementData, r,
elementData, w,
size - r);
w += size - r;
}
if (w != size) {
for (int i = w; i < size; i++)
elementData[i] = null;
modCount += size - w;
size = w;
modified = true;
}
}
return modified;
}
ごく少数の要素のみが異なる場合は、方法 2 の方が適切です。