输出一个集合的所有子集,从长到短

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");
        }
    }
}

用到了位操作的知识,感觉比较巧妙和高效。

posted @ 2014-09-26 17:27  楠楠IT  阅读(555)  评论(1编辑  收藏  举报