怎么样可以快速的查找两个集合相同的内容,需要思路啊 ,谢谢各位了
可以尝试下List的retainAll方法,有篇文章你可以参考下:[url]http://huang552.iteye.com/blog/420972[/url]
是效率高?还是方法简单?
如是要是方法简单
for(i=0;i<集合1.size;i++){
取出元素;
if(集合2.contains(元素)
打印
}
能求一下两个集合的交集吗?如果有提供这样的api,取得的交集就肯定是两个集合相同部分了。。哈哈,我只提供下思路!
求交集要快的话,1.先对两个集合分别排序, 排序时间复杂度一般是logn,2. 然后两个指针分别从头比较,谁小移动谁,一样就记录。时间复杂度是m+n。
去common 包找找,集合那应该有相应的API
import java.util.HashSet;
import java.util.Set;
public class FindDups {
public static void main(String[] args){
Set set1 = new HashSet();
Set set2 = new HashSet();
//set1
set1.add("name");
set1.add("sex");
set1.add("height");
set1.add("weight");
set1.add("size");
//set2
set2.add("name");
set2.add("sex");
set2.add("age");
Set sym = new HashSet(set1);
Set tmp = new HashSet(set1);
sym.retainAll(set2);
tmp.removeAll(set2);
set2.removeAll(set1);
System.out.println("set1&set2:"+sym.size());
System.out.println("set1&set2:"+sym); //set1和set2交集
System.out.println("set1-set2"+"新增数量:"+tmp.size());
System.out.println("set1-set2:"+tmp); //set1和set2差集
System.out.println("set2-set1"+"剔除数量:"+set2.size());
System.out.println("set2-set1:"+set2); //set2和set1差集
}
}
org.apache.commons.collections.CollectionUtils
Collection union = CollectionUtils.union( a, b ); //并集
Collection intersection = CollectionUtils.intersection( a, b ); //交集
Collection disjunction = CollectionUtils.disjunction( a, b ); //析取
Collection subtract = CollectionUtils.subtract( a, b ); //差集
你们也太费劲了:
不用重复造轮子了,
一行代码就可以了,请参考:
List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
list1.add("111");
list1.add("222");
list1.add("222")
list1.add("333");
list2.add("444");
list2.add("222");
list2.add("222");
list2.add("555");
Collection ret = CollectionUtils.intersection(list1, list2);
CollectionUtils--->org.apache.commons.collections.CollectionUtils
原理上是通过将两个collection转换成mapa和mapb,然后两个map再合并到一个set
中,利用set的自身唯一性,然后遍历这个set,看每个set项在两个map中是否存在
找到了则放入返回集合中,关键这个的强大之处是还能返回相同的两个222,
效率应该还可以.
看了一楼的回答,为了满足String、Object等不同的类型求集合交集 可以采用泛型,写一泛型工具类,这里是两静态方法,判断对象空 ObjectUtil类可以自己写一个。请参考。以下是代码片段:
[code="java"]
//求交集
public static Set intersectHashSet(Set setOne, Set setOther) {
if (ObjectUtil.isEmpty(setOne) || ObjectUtils.isEmpty(setOther))
return null;
Set result = getHashSet(setOne);
result.retainAll(setOther);
return result;
}
public static Set getHashSet(Collection<? extends T> c) {
if (ObjectUtil.isEmpty(c))
return new HashSet();
return new HashSet(c);
}
[/code]
http://www.blogjava.net/willpower88/archive/2010/08/31/330437.html
支持1楼的做法,用List提供的找交集的方法吧,不要重复造轮子
先排序,再相减。。。