输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。

转载声明:原文转自http://www.cnblogs.com/xiezie/p/5511707.html

昨天晚上,有个朋友找到我,他在用matlab编程,但是遇到一个问题,解决不了。

问题如下:

输入n个数组,数组长度不等,从每个数组取出一个数进行组合,求出所有的组合。

例子:

int a[]={1,2};

int b[]={3,4,5};

可能的组合:{1,3};{1,4};{1,5};{2,3};{2,4};{2,5};

 

搞了40分钟左右,不辱使命~

JAVA代码实现:

 

import java.io.BufferedInputStream;
import java.util.ArrayList;
import java.util.Scanner;

public class Test {
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(new BufferedInputStream(System.in));
     //这里使用ArrayList<ArrayList<Integer>>是为了方便int数组的操作 ArrayList
<ArrayList<Integer>> lists = new ArrayList<>();//若已知所以组合的具体个数可以定义容量长度--》提高性能 System.out.println("输入要所有数组的总个数:"); int n = scanner.nextInt();//数组的个数 int[] allLen = new int[n];//所有数组的长度 int index = 0; int ll = n ; while(ll--!=0){ System.out.println("输入第" + (index + 1) + "个数组的长度:"); int m = scanner.nextInt();//输入一个数组的长度 allLen[index++] = m; ArrayList<Integer> arrayList = new ArrayList<>(m); System.out.println("输入第" + index + "个数组的数据:" + "个数为\t" + m); for(int i = 0 ; i != m ; i ++ ){ arrayList.add(scanner.nextInt()); } lists.add(arrayList); } int[] allLenProduct = new int[n];//数组的长度乘积增量 int p = 1; //组合的个数 int l = n; int index1 = 0; ArrayList<ArrayList<Integer>> results = new ArrayList<>(p); while(--l!=-1){ allLenProduct[index1] = p; p=allLen[index1++]*p; } for(int i = 0 ; i != p ; i ++ ){ ArrayList<Integer> arrayList = new ArrayList<>(n); for(int j = 0 ; j != n ; j ++){ arrayList.add(lists.get(j).get(i/allLenProduct[j]%allLen[j])); } results.add(arrayList); } int len = results.size(); System.out.println("所有的组合:"); for(int i = 0 ; i != len ; i ++ ){ ArrayList<Integer> arrayList = results.get(i); int aLen = arrayList.size(); System.out.print("\t第\t" + (i + 1) + "\t行:\t"); for(int j = 0 ; j != aLen ; j ++){ System.out.print(arrayList.get(j) + " "); } System.out.println(); } scanner.close(); } }

 

测试:

输入:

输入要所有数组的总个数:
4
输入第1个数组的长度:
2
输入第1个数组的数据:个数为 2
1 2
输入第2个数组的长度:
3
输入第2个数组的数据:个数为 3
4 5 6
输入第3个数组的长度:
3
输入第3个数组的数据:个数为 3
7 8 9
输入第4个数组的长度:
4
输入第4个数组的数据:个数为 4
10 11 12 13

 

结果:

所有的组合:
第 1 行: 1 4 7 10
第 2 行: 2 4 7 10
第 3 行: 1 5 7 10
第 4 行: 2 5 7 10
第 5 行: 1 6 7 10
第 6 行: 2 6 7 10
第 7 行: 1 4 8 10
第 8 行: 2 4 8 10
第 9 行: 1 5 8 10
第 10 行: 2 5 8 10
第 11 行: 1 6 8 10
第 12 行: 2 6 8 10
第 13 行: 1 4 9 10
第 14 行: 2 4 9 10
第 15 行: 1 5 9 10
第 16 行: 2 5 9 10
第 17 行: 1 6 9 10
第 18 行: 2 6 9 10
第 19 行: 1 4 7 11
第 20 行: 2 4 7 11
第 21 行: 1 5 7 11
第 22 行: 2 5 7 11
第 23 行: 1 6 7 11
第 24 行: 2 6 7 11
第 25 行: 1 4 8 11
第 26 行: 2 4 8 11
第 27 行: 1 5 8 11
第 28 行: 2 5 8 11
第 29 行: 1 6 8 11
第 30 行: 2 6 8 11
第 31 行: 1 4 9 11
第 32 行: 2 4 9 11
第 33 行: 1 5 9 11
第 34 行: 2 5 9 11
第 35 行: 1 6 9 11
第 36 行: 2 6 9 11
第 37 行: 1 4 7 12
第 38 行: 2 4 7 12
第 39 行: 1 5 7 12
第 40 行: 2 5 7 12
第 41 行: 1 6 7 12
第 42 行: 2 6 7 12
第 43 行: 1 4 8 12
第 44 行: 2 4 8 12
第 45 行: 1 5 8 12
第 46 行: 2 5 8 12
第 47 行: 1 6 8 12
第 48 行: 2 6 8 12
第 49 行: 1 4 9 12
第 50 行: 2 4 9 12
第 51 行: 1 5 9 12
第 52 行: 2 5 9 12
第 53 行: 1 6 9 12
第 54 行: 2 6 9 12
第 55 行: 1 4 7 13
第 56 行: 2 4 7 13
第 57 行: 1 5 7 13
第 58 行: 2 5 7 13
第 59 行: 1 6 7 13
第 60 行: 2 6 7 13
第 61 行: 1 4 8 13
第 62 行: 2 4 8 13
第 63 行: 1 5 8 13
第 64 行: 2 5 8 13
第 65 行: 1 6 8 13
第 66 行: 2 6 8 13
第 67 行: 1 4 9 13
第 68 行: 2 4 9 13
第 69 行: 1 5 9 13
第 70 行: 2 5 9 13
第 71 行: 1 6 9 13
第 72 行: 2 6 9 13

posted on 2016-05-20 12:57  xiezie  阅读(2882)  评论(0编辑  收藏  举报

导航