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}
is3
combined 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} }
.