如何从ArrayList
中删除不常见的元素?方案是我有两个ArrayList
个对象:arr1
和arr2
。 arr2
几乎包含arr1
的所有元素。现在,我想要从arr1
中删除不属于arr2
。
我怎样才能做到这一点?是否有任何方法或技术可以删除两个ArrayList
对象之间的不常见元素?
答案 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));
}