/**
* @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版权协议,转载请附上原文出处链接和本声明。