public static List> powerset(Collection list) { List> ps = new ArrayList>(); ps.add(new ArrayList()); // add the empty set // for every item in the original list for (T item : list) { List> newPs = new ArrayList>(); for (List subset : ps) { // copy all of the current powerset's subsets newPs.add(subset); // plus the subsets appended with the current item List newSubset = new ArrayList(subset); newSubset.add(item); newPs.add(newSubset); } // powerset is now powerset of list.subList(0, list.indexOf(item)+1) ps = newPs; } return ps; }