Java 求集合的所有子集

递归方法调用,求解集合的所有子集。

package ch01;

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class QuerySubSet {

    public static List<Set<Object>> Query(Set<Object>   target)
    {
        if(target.size() == 0)
        {
            List<Set<Object>> list= new LinkedList<Set<Object>>();
            list.add(target);
            return list;
        }else if(target.size() == 1)
        {
            List<Set<Object>> list= new LinkedList<Set<Object>>();
            list.add(target);
            Set<Object> nullset=new HashSet<Object>();
            list.add(nullset);
            return list;
        }else
        {
            Iterator<Object> iter=target.iterator();
            Object elem=iter.next();
            target.remove(elem);
            Set<Object> newSet=new HashSet<Object>();
            newSet.add(elem);

            List<Set<Object>> list1=Query(newSet);
            List<Set<Object>> list2=Query(target);
            return merge(list1, list2);
        }
    }

    public static   List<Set<Object>> merge(List<Set<Object>> list1, List<Set<Object>> list2)
    {
         List<Set<Object>> mlist=new LinkedList<Set<Object>>();
         for(Set<Object> set1: list1 )
             for(Set<Object> set2: list2)
             {
                 Set<Object>  newSet=new HashSet();
                 newSet.addAll(set1);
                 newSet.addAll(set2);
                 mlist.add(newSet);
             }
         return mlist;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Set<Object>     targ=new HashSet<Object>();
        for(int i=0; i<10; i++)
        {
            targ.add(Integer.toString(i));
        }

        List<Set<Object>> allsubset= QuerySubSet.Query(targ);

        boolean f1=true;
        for(Set<Object> set1: 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("}");
        }

    }

}
时间: 2024-10-12 22:23:23

Java 求集合的所有子集的相关文章

傻瓜方法求集合的全部子集问题(java版)

给定随意长度的一个集合.用一个数组表示,如{"a", "b","c"},求它的全部子集.结果是{ {a}, {b}, {c}, {a,b}, {a,c}, {b,c}, {a,b,c}}和一个空集. 以下讲的就是怎样用一个原始的傻瓜方法(非算法)求它的全部子集. 首先我们知道是它的子集个数是2^length,假设长度是3,那子集就共同拥有2的3次方=8个,包含空集. 求子集,我的做法是对不论什么一项做推断,有或者无,用1和0来相应表示. 那么像这

JAVA求集合中的组合

好几个月没弄代码了,今天弄个求组合的DEMO 思路是将集合的每个值对照一个索引,索引大小是集合的大小+2.索引默认为[000...000],当组合后选取的组合值demo为[0100..00].然后根据遍历索引来到集合中取值. 上代码: import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ComBit { public static void main(String[]

回溯法 求集合全排列、子集

全排列: 全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个. 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列. 以对字符串abc进行全排列为例,我们可以这么做:以abc为例固定a,求后面bc的排列:abc,acb,求好后,a和b交换,得到bac固定b,求后面ac的排列:bac,bca,求好后,c放到第一位置,得到cba固定c,求后面ba的排列:cba,cab. 这个思想和回溯法比较吻合. 代码可如下编

两种求集合所有子集的方法

假设我们有一个求集合的全部子集(包含集合自身)的需求,即有一个集合s,包含两个元素 <a,b>,则其全部的子集为<a,ab,b>. 不难求得,子集个数sn与原集合元素个数n之间的关系为:sn=2^n-1. 本文分别讲述两种实现方法: 一:位图法: 1)构造一个和集合一样大小的数组A,分别与集合中的某个元素对应,数组A中的元素只有两种状态:"1"和"0",分别代表每次子集输出中集合中对应元素是否要输出,这样数组A可以看作是原集合的一个标记位图.

两种求集合全部子集的方法

如果我们有一个求集合的所有子集(包括集合自身)的需求,即有一个集合s,包括两个元素 <a,b>,则其所有的子集为<a,ab,b>. 不难求得,子集个数sn与原集合元素个数n之间的关系为:sn=2^n-1. 本文分别讲述两种实现方法: 一:位图法: 1)构造一个和集合一样大小的数组A,分别与集合中的某个元素相应,数组A中的元素仅仅有两种状态:"1"和"0",分别代表每次子集输出中集合中相应元素是否要输出.这样数组A能够看作是原集合的一个标记位图

【Leetcode】78. Subsets(求集合的子集问题)

78. Subsets(求集合的子集问题) [分析]:求集合的所有子集问题.题目要求子集中元素非递减序排列,因此我们先要对原来的集合进行排序.原集合中每一个元素在子集中有两种状态:要么存在.要么不存在.这样构造子集的过程中每个元素就有两种选择方法:选择.不选择,因此可以构造一颗二叉树,例如对于例子中给的集合[1,2,3],构造的二叉树如下(左子树表示选择该层处理的元素,右子树不选择),最后得到的叶子节点就是子集:{ 链接 } 1 class Solution 2 { 3 private: 4 v

java求两个集合的差集

public static void main(String[] args) {Set set = new HashSet();Set set1 = new HashSet();set.add("sanny");set.add("mary");set.add("bill");set.add("tom");set.add("tony");set.add("mark");set.add(&q

求一个集合的所有子集问题

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/31042651 作者:小马 一个包含n个元素的集合,求它的所有子集.比如集合A= {1,2,3}, 它的所有子集是: { {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}, @}(@表示空集). 这种问题一般有两种思路,先说说第一种,递归.递归肯定要基于一个归纳法的思想,这个思想用到了二叉树的遍历,如下图所示: 可以这样理解这张图,从集合A的每

求集合的子集

package com.xsz.demo; /**     * @author cwqi    * @date 2014-11-19 下午9:55:31    */ public class SubSet { /**  * 求集合的子集  * @param args  */ public static void main(String[] args) { int array[] = {1,2,3}; SubSet.getSubSet(array); } private static void g