java获取Set所有子集

/**
 * @Author: 长得太帅,要好好反省!
 * @Date: 2020/10/31
 * @Description:
 */
public class C {
    private static int size;
    
    public static void main(String[] a){
        Set set = new HashSet();
        set.add("1");
        set.add("2");
        set.add("3");
        set.add("4");
        size = set.size();
        getChild(set);
    }


    static void getChild(Set set){
        Set child = new HashSet();
        System.out.println(child);
        getChild(set, child);
    }

    /**
     * 获取子集,原理是 子集+补集元素拼凑出其他子集
     * {1,2,3,4}:
     * 1,2,3,4 和 {}拼凑出{1},{2},{3},{4}
     * 2,3,4 和 {1} 拼凑出{1,2}, {1,3},{1,4}
     * 此时{2}进行拼凑时,应该和{3,4}拼凑,因此使用过的补集元素在同一个循环不应再次出现,否则会出现{2,1}
     * {1,2}和 3,4 拼凑出{1,2,3}, {1,2,4}
     * @param com Complement 子集的补集
     * @param child 子集 一般从空集开始
     */
    static void getChild(Set com, Set child){
        if(size == child.size()) return;
        int setSize = child.size();
        Iterator iterator = com.iterator();
        Set s = new HashSet(com);
        while (iterator.hasNext()){
        	// 首次执行结果:{1,2,3,4}	{}
            Object item = iterator.next();
            // 首次执行结果:{1,2,3,4}	{1}
            child.add(item);      
            // 首次执行结果:{2,3,4}		{1}  
            s.remove(item);         
            if(child.size() == setSize) continue; // 如果child添加了重复的元素,跳过循环
            System.out.println(child);	// 输出: [1]
            getChild(s, child);     // 递归调用 {2,3,4}	{1}
            child.remove(item);     // 首次执行结果:{2,3,4}  {}
        }
    }

}

版权声明:本文为weixin_44061022原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。