输出一个集合的所有子集,从长到短
public class Ziji { public static List<List<Integer>> Sets(int a[]) { List<List<Integer>> res = new ArrayList<List<Integer>>(); int len = a.length; int n = 1 << len; for (int i = n; i > 0; i--) { int k = i; List<Integer> list = new ArrayList<Integer>(); for (int j = 0; j < len; j++) { if ((k & 1) == 1) { list.add(a[j]); } k = k >> 1; } res.add(list); } Collections.sort(res, new Comparator<List<Integer>>() { @Override public int compare(List<Integer> listA, List<Integer> listB) { // TODO Auto-generated method stub return listB.size() - listA.size(); } }); return res; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[] a = { 1, 2, 3, 4 }; List<List<Integer>> res = Ziji.Sets(a); for (List<Integer> rr : res) { for (Integer r : rr) { System.out.print(r); } System.out.println("\n"); } } }
用到了位操作的知识,感觉比较巧妙和高效。