Java:生成Powerset

问题描述:

这可能是语言不可知/有用的答案可能只是在伪代码中。Java:生成Powerset

我有一个程序,我想测试一系列的输入。该程序需要一组文件,其中之一被指定为根。我想用所有可能的文件子集来运行程序。 (包含相同文件但具有不同根的两个子集被认为是不同的。)

下面是一个相同的例子。说我有文件A,B和C.我想要测试:

{A}, root = A 
{B}, root = B 
{C}, root = C 
{A B}, root = A 
{A B}, root = B 
{B C}, root = B 
{B C}, root = C 
{A C}, root = A 
{A C}, root = C 
{A B C}, root = A 
{A B C}, root = B 
{A B C}, root = C 

等等。我相信这将是权力。

在给定文件夹的目录下,用Java生成这个集合的最佳方法是什么?

+0

http://*.com/questions/873413/nonrecursively-generating-all-possible-permutations-of-elements-from-two-arrays – 2009-11-04 05:05:36

这就是你以后(psuedocode)?

set = new List() 
foreach (file in dir) { 
    set.add(file) 
    foreach (entry in set) { 
     do-test(set, entry) 
    } 
} 

这将生成一组,然后通过集,以及所述集合到一个do-test方法中的每个条目。

你说的是Java,但请看看这个:Permutations, Combinations, and Variations using C# Generics

下面是伪代码递归的方法来对所有可能的mixes.largest-子集,首先进行测试:

allofthem = set(listallfiles(thedir)) 

function trythemall(someset): 
    if someset is empty: return 
    for entry in someset: 
    dotest(someset, root=entry) 
    for entry in someset: 
    trythemall(someset - set([entry])) 

trythemall(allofthem) 

不难REORG当然,如果你首先想要最小的子集。

+0

这将工作,但我实际上意识到我的问题说明是不正确的。往上看。 – 2009-11-04 04:46:32

+0

好的,我已经看到了你的编辑,在我看来,我提议的区别在于,在我的伪代码中,一些子集不止一次提交 - 如果这是你的问题,请澄清,我会提出解决它,TX! – 2009-11-04 05:04:22

+0

我相信,问题在于存在不会由您的解决方案生成的子集。 – 2009-11-04 13:30:25