如何從ArrayList
中刪除不常見的元素?該場景是我有兩個ArrayList
對象:arr1
和arr2
。 arr2
幾乎包含所有元素arr1
。現在我想從arr1
中刪除這些元素,這些元素不在arr2
中。如何從兩個陣列中刪除不常見的元素
我該如何做到這一點?有沒有任何方法或技術去除兩個物體之間的不常見元素?
如何從ArrayList
中刪除不常見的元素?該場景是我有兩個ArrayList
對象:arr1
和arr2
。 arr2
幾乎包含所有元素arr1
。現在我想從arr1
中刪除這些元素,這些元素不在arr2
中。如何從兩個陣列中刪除不常見的元素
我該如何做到這一點?有沒有任何方法或技術去除兩個物體之間的不常見元素?
您可以使用ArrayList中實現的retainAll
方法。 它就像一個集合的交集。
使用CollectionUtils.retainAll
:返回集合,其中包含集合1中也在集合2中的所有元素。
ArrayList commonList = CollectionUtils.retainAll(list1,list2);
然後去掉一個罕見的元素與循環
約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()
將完整的arr2
複製到arr1
而不是刪除單個元素。 System.arraycopy是本地實現的,速度非常快。
以下是對此操作的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會更好。
這是基於我的解決方案上的一些以前的答案
/**
* Returns elements in List A that are not in List B. (i.e. the relative complement of A with respect to B)
* see https://en.wikipedia.org/wiki/Complement_(set_theory)#Relative_complement
* @param a
* @param b
* @return
*/
private <E> List<E> relativeComplement(List<E> a, List<E> b) {
return ListUtils.removeAll(a, ListUtils.retainAll(a,b));
}
的排序兩個列表?列表中是否有重複的元素? –
是這兩個列表都排序...! – Rony