2013-01-15 103 views
1

如何從ArrayList中刪除不常見的元素?該場景是我有兩個ArrayList對象:arr1arr2arr2幾乎包含所有元素arr1。現在我想從arr1中刪除這些元素,這些元素不在arr2中。如何從兩個陣列中刪除不常見的元素

我該如何做到這一點?有沒有任何方法或技術去除兩個物體之間的不常見元素?

+1

的排序兩個列表?列表中是否有重複的元素? –

+0

是這兩個列表都排序...! – Rony

回答

3

您可以使用ArrayList中實現的retainAll方法。 它就像一個集合的交集。

4

使用CollectionUtils.retainAll:返回集合,其中包含集合1中也在集合2中的所有元素。

ArrayList commonList = CollectionUtils.retainAll(list1,list2); 

然後去掉一個罕見的元素與循環

1

arr1.retainAll(arr2);什麼?

1

方法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會更好。

0

這是基於我的解決方案上的一些以前的答案

/** 
* 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)); 
}