[code="java"]
List biglist;
List smalllist;
[/code]
两个List
smalllist是biglist的子集
怎么比较List里面存的对象相同呢?
大家说一说方便一点的方法?
谢谢
[b]问题补充:[/b]
我想确认的是把LIST中相同的找出来
smalllist是大LIST的子集
org.apache.commons.collections.CollectionUtils工具类
[code="java"]CollectionUtils.isEqualCollection(biglist,smalllist)[/code]
写一个静态方法,随处可以使用:
[code="java"]
//不考虑元素顺序是否相同
public static boolean isSame(List a,List b){
if(a.size() != b.size()){
return false;//先比较个数
}
for(Object tem : a){
if(!b.contains(tem)){//不包含tem元素
return false;
}
}
return true;
}[/code]
List本身就包含一个取交集的方法..retainAll(Collection<?> c)
这个方法会保存仅在列表中保留指定 collection 中所包含的元素
都子集了,还怎么相等?长度不同的两个List是不相等的
[code="java"]
List a ;
for(int i=0;i<biglist.size();i++){
for(int j=0;j<smalllist.size();j++){
if(==){
a.add(***);
}
}
}
[/code]
最简单的
另外list的equals方法就可以比较
楼主是不是想问怎么确认smalllist是不是biglist的子集?
[code="java"]
biglist.containsAll(smalllist)
[/code]
list的equals方法是被重写过的,先比较两个list的长度,在比较对应的元素,用的是equals方法
smalllist都是大LIST的子集,当然相同的部分就是smalllist了
可以这样:
[code="java"]
//不考虑元素顺序是否相同
public static List getSameElement(List a,List b){
List sameElementList = null;
for(Object tem : a){
if(b.contains(tem)){//包含tem元素
if(sameElementList == null){
sameElementList = new ArrayList();
}
sameElementList.add(tem);
}
}
return sameElementList ;
}
[/code]
如果是这样的话,比较快的方法就是先把两个List中的元素排序
然后将smallList中的元素与bigList中的元素进行比较
因为按照数据结构的说法,查找有序队列是最快的
如果注重效率的话,不能使用两次循环的方法。
这是肯定的,如果碰到两次循环、三次循环它的复杂度是O(M*N)、O(M*N*P)
所以最好的方法是把二次循环变成两个一次循环,这样效率上会大大提升
[code="java"]import java.util.List;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
List bigList = new ArrayList();
bigList.add(new Integer(1));
bigList.add(new Integer(2));
bigList.add(new Integer(3));
List smallList = new ArrayList();
smallList.add(new Integer(1));
smallList.add(new Integer(3));
if (bigList.containsAll(smallList))
System.out.println("smallList is a subset of bigList");
else
System.out.println("smallList is not a subset of bigList");
smallList.add(new Integer(4));
if (bigList.containsAll(smallList))
System.out.println("smallList is a subset of bigList");
else
System.out.println("smallList is not a subset of bigList");
}
}[/code]
下面是containAll的实现:
[code="java"]public boolean containsAll(Collection<?> c) {
Iterator<?> e = c.iterator();
while (e.hasNext())
if(!contains(e.next()))
return false;
return true;
}[/code]