2015-10-07 36 views
2

在java中,我有一个集合,我想获得它们的联合集合作为主集合的子集的所有可能的组合。 (分割一个集合) 例如: 集合= {1,2,3}得到一个集合的所有可能的分区

结果应该是:

{ {{1,2,3},{}} , {{1},{2,3}} , {{1,2},{3}} , {{1,3},{2}}, {{1},{2},{3}}} 

到目前为止的代码:

public static <T> Set<Set<T>> powerSet(Set<T> myset) { 
     Set<Set<T>> pset = new HashSet<Set<T>>(); 
     if (myset.isEmpty()) { 
      pset.add(new HashSet<T>()); 
      return pset; 
     } 
     List<T> list = new ArrayList<T>(myset); 
     T head = list.get(0); 
     Set<T> rest = new HashSet<T>(list.subList(1, list.size())); 
     for (Set<T> set : powerSet(rest)) { 
      Set<T> newSet = new HashSet<T>(); 
      newSet.add(head); 
      newSet.addAll(set); 
      pset.add(newSet); 
      pset.add(set); 
     } 

     return pset; 
    } 

输出该幂的阵列:

[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]] 
+2

你已经生成了什么代码? –

+0

我可以提取集合的powerset和也只有两个集合的分区,例如只是{{1,2},{3}}和{{1,3},{2}} –

+0

好的,编辑您的文章并给我们的源代码 –

回答

2

最简单的解决方案是使用递归关于你的集合的元素数目:构建一个构造n元素集合的所有分区的函数。对于n + 1个元素,您可以将新元素添加到现有分区集合中,也可以将其放入一组其自己的元素中。

+0

可以请你解释一下吗? –

+1

您可以构建一个函数,它将地面元素的数量n作为参数。如果n = 0,这个函数只是返回空集。否则,它使用参数n-1调用它自己,并使用上面解释的结果来计算n的答案。对不起,我不能给你代码片段,因为我不是Java程序员。但是这种递归方法是一种通用模式,也适用于Java。 – MightyCurious

相关问题