我想先说这是一个学校作业,所以当我需要帮助时,最好为我指出正确的方向,而不是给我代码来使用。
因此,任务是能够打印出任何给定集合的 PowerSet(给定集合的所有子集的集合)。我对 Java 有一定的经验,但递归是我的弱点之一,所以我很难想象这一点。
我的方法返回所有包含“d”和空集的子集。
这是我到目前为止所拥有的:
public static TreeSet<TreeSet<Character>> powerSet(TreeSet<Character> setIn)
{
Comparator<TreeSet<Character>> comp = new Comparator<TreeSet<Character>>()
{
@Override
public int compare(TreeSet<Character> a, TreeSet<Character> b)
{
return a.size() - b.size();
}
};
TreeSet<TreeSet<Character>> temp = new TreeSet<TreeSet<Character>>(comp);
if (setIn.isEmpty())
{
temp.add(new TreeSet<Character>());
return temp;
}
Character first = setIn.first();
msg(first);
setIn.remove(first);
TreeSet<TreeSet<Character>> setA = powerSet(setIn);
temp.addAll(setA);
for (TreeSet<Character> prox : setA)
{
TreeSet<Character> setB = new TreeSet<Character>(prox);
setB.add(first);
temp.add(setB);
}
return temp;
}
给定集合
[a, b, c, d]
这个方法给了我一套
[[], [d], [c, d], [b, c, d], [a, b, c, d]]
但我们知道 PowerSet 应该是
[[], [a], [b], [c], [d], [a, b], [a, c], [a, d], [b, c], [b, d], [c, d],
[a, b, c], [a, b, d], [a, c, d], [b, c, d], [a, b, c, d]]
任何朝着正确方向发展的帮助将不胜感激。
编辑:我的问题是一个非常愚蠢的问题。我忘记正确设置比较器,它排除了结果。我修复了比较器以正确排序而不会丢弃集合。
这里是:
public int compare(TreeSet<Character> a, TreeSet<Character> b)
{
if(a.equals(b))
return 0;
if(a.size() > b.size())
return 1;
return -1;
}