如何从两个arraylist中删除不常见的元素

时间:2013-01-15 06:59:42

标签: java android multidimensional-array arraylist

如何从ArrayList中删除不常见的元素?方案是我有两个ArrayList个对象:arr1arr2arr2几乎包含arr1的所有元素。现在,我想要从arr1中删除不属于arr2

的元素

我怎样才能做到这一点?是否有任何方法或技术可以删除两个ArrayList对象之间的不常见元素?

5 个答案:

答案 0 :(得分:4)

使用CollectionUtils.retainAll:返回一个集合,其中包含collection1中同样位于collection2中的所有元素。

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

然后使用for循环

删除uncommon的元素

答案 1 :(得分:3)

您可以使用ArrayList中实现的retainAll方法。 它就像一个交集。

答案 2 :(得分:1)

arr1.retainAll(arr2);怎么样?

答案 3 :(得分: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会更好。

答案 4 :(得分: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));
}