任意二维数组输出排序组合
问题描述:
当数组 {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; } }
我们曾如此渴望生命的波澜,到后来才发现,人生最曼妙的风景是内心的淡定与从容

浙公网安备 33010602011771号