packagech01;importjava.util.HashSet;importjava.util.Iterator;importjava.util.LinkedList;importjava.util.List;importjava.util.Set;public classQuerySubSet {
// 递归调用, 求出 Set的子集, 返回List列表public static List> Query(Settarget)
{
// 如果 target为空, 则停止递归,并且 返回的list中 包含一个空集if(target.size() == 0)
{
List> list= new LinkedList>();
list.add(target);returnlist;
}
// 如果 target 中有一个元素, 那么改target的子集体包括 空集 和 自身else if(target.size() == 1)
{
List> list= new LinkedList>();
list.add(target);
Set nullset=new HashSet();
list.add(nullset);returnlist;
}
// 如果 target中的元素大于 1 个,则将target分成两个新的集合,并求出两个新集合的所有子集,再将两个List子集进行合并,即可以得到target的所有子集。else{
Iterator iter=target.iterator();
Object elem=iter.next();
target.remove(elem);
Set newSet=new HashSet();
newSet.add(elem);
List> list1=Query(newSet); // 递归调用
List> list2=Query(target); // 递归调用returnmerge(list1, list2); // 合并两个 list
}
}
// 合并两个list, 两次for循环遍历两个list列表。public static List> merge(List> list1, List>list2)
{
List> mlist=new LinkedList>();for(Setset1: list1 )for(Setset2: list2)
{
Set newSet=newHashSet();
newSet.addAll(set1);
newSet.addAll(set2);
mlist.add(newSet);
}returnmlist;
}/***@paramargs*/
public static voidmain(String[] args) {//TODO Auto-generated method stub
Set targ=new HashSet();for(int i=0; i<10; i++)
{
targ.add(Integer.toString(i));
}
List> allsubset=QuerySubSet.Query(targ);boolean f1=true;for(Setset1: allsubset)
{if(!f1)
System.out.print(",");
f1=false;
System.out.print("{");boolean f2=true;for(Object obj: set1)
{if(!f2)
System.out.print(",");
f2=false;
System.out.print(obj.toString());
}
System.out.println("}");
}
}
}