任意二维数组输出排序组合

问题描述: 
  当数组 {1,2,3}{4,5}的排列组合是{1,4},{1,5},{2,4},{2,5}...
  当数组 {1,2,3}{4,5},{6,7}的排列组合是{1,4,6},{1,4,7},{1,5,6},{1,5,7}...
 具体思路,多个集合的组合排列都可以看成是两个集合的组合排列,举个例子,现在有两种颜色的球红儿和绿色,每个颜色分别有两个,编号为1和2,那么此时他们的排列组合方式是 红1绿1,红1绿2,红2绿1,红2绿2;此时黄色球也想参与
组合,那么此时我们可以之前已经组合好的(红1绿1)看成一个整体,进行与黄色的排列组合,如果后面再有更多,同理;思路有了,来具体看代码:

public class NewCartesianProduct {
    public static void main(String[] args) {
        int[][] a = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}, {9, 0}};

        int length = a.length;
        int[][] re = change(a[0]);
        for (int i = 0; i < length - 1; i++) {
            if (i + 1 <= length) {
                re = deal2(re, a[i + 1]);
            }
        }

        // 效果输出
        System.out.println("笛卡尔积个数:" + re.length);
        for (int[] ints : re) {
            StringBuilder bu = new StringBuilder("[");
            for (int anInt : ints) {
                bu.append(anInt);
                bu.append(",");
            }
            bu.replace(bu.lastIndexOf(","), bu.length(), "");
            bu.append("]");
            System.out.println(bu.toString());
        }
    }

    private static int[][] change(int[] a) {
        int[][] b = new int[a.length][1];
        for (int i = 0; i < a.length; i++) {
            b[i][0] = a[i];
        }
        return b;
    }

    /**
     * {{1,4} {1,5},{2,4}}  {6,7}
     *
     * @param ints
     * @param ints {1,4,6}
     */
    private static int[][] deal2(int[][] ints, int[] ints1) {
        int aLe = ints[0].length + 1;
        int size = ints.length * ints1.length;
        int[][] result = new int[size][aLe];
        int index = 0;
        for (int[] ints0 : ints) {
            for (int i : ints1) {
                for (int j = 0; j < aLe - 1; j++) {
                    result[index][j] = ints0[j];
                }
                result[index][aLe - 1] = i;
                index++;
            }
        }

        return result;
    }
}

 

posted @ 2021-11-16 22:37  zlAdmin  阅读(250)  评论(0)    收藏  举报