What you want is called a Powerset. Here is a simple implementation of it:
public static Set<Set<Integer>> powerSet(Set<Integer> originalSet) {
Set<Set<Integer>> sets = new HashSet<Set<Integer>>();
if (originalSet.isEmpty()) {
sets.add(new HashSet<Integer>());
return sets;
}
List<Integer> list = new ArrayList<Integer>(originalSet);
Integer head = list.get(0);
Set<Integer> rest = new HashSet<Integer>(list.subList(1, list.size()));
for (Set<Integer> set : powerSet(rest)) {
Set<Integer> newSet = new HashSet<Integer>();
newSet.add(head);
newSet.addAll(set);
sets.add(newSet);
sets.add(set);
}
return sets;
}
I will give you an example to explain how the algorithm works for the powerset of {1, 2, 3}:
- Remove
{1}, and execute powerset for{2, 3};- Remove
{2}, and execute powerset for{3};- Remove
{3}, and execute powerset for{};- Powerset of
{}is{{}};
- Powerset of
- Powerset of
{3}is3combined with{{}}={ {}, {3} };
- Remove
- Powerset of
{2, 3}is{2}combined with{ {}, {3} }={ {}, {3}, {2}, {2, 3} };
- Remove
- Powerset of
{1, 2, 3}is{1}combined with{ {}, {3}, {2}, {2, 3} }={ {}, {3}, {2}, {2, 3}, {1}, {3, 1}, {2, 1}, {2, 3, 1} }.