最近做项目,遇到一个需求,需要用到下列排列组合方法,于是记下来,将来再遇到此类方法时,直接拿来用。
先设置几个数组
a1,a2,a3,a4 list[0] 长度4
b1,b2,b3 list[1] 长度3
c1,c2 list[2] 长度2
d1,d2,d3 list[3] 长度3
一共有4*3*2*3 = 72种组合(a1b1c1d1算是一种,但是b1a1c1d1等等内容相同,位置不同的不算)
是一个array[72]的数组
array[0] = list[0][0]list[1][0]list[2][0]list[3][0] = a1b1c1d1 1/72
array[1] = list[0][0]list[1][0]list[2][0]list[3][1] = a1b1c1d2 2/72
array[2] = list[0][0]list[1][0]list[2][0]list[3][2] = a1b1c1d3 3/72
array[3] = list[0][0]list[1][0]list[2][1]list[3][0] = a1b1c2d1 4/72
array[4] = list[0][0]list[1][0]list[2][1]list[3][1] = a1b1c2d2 5/72
array[5] = list[0][0]list[1][0]list[2][1]list[3][2] = a1b1c2d3 6/72
......
array[65] = list[0][3]list[1][1]list[2][1]list[3][2] = a4b2c2d3 66/72
array[66] = list[0][3]list[1][2]list[2][0]list[3][0] = a4b3c1d1 67/72
array[67] = list[0][3]list[1][2]list[2][0]list[3][1] = a4b3c1d2 68/72
array[68] = list[0][3]list[1][2]list[2][0]list[3][2] = a4b3c1d3 69/72
array[69] = list[0][3]list[1][2]list[2][1]list[3][0] = a4b3c2d1 70/72
array[70] = list[0][3]list[1][2]list[2][1]list[3][1] = a4b3c2d2 71/72
array[71] = list[0][3]list[1][2]list[2][1]list[3][2] = a4b3c2d3 72/72
找到规律:
array[i] = list[0][i / (3 * 2 * 3) % 4]list[1][i / (2 * 3) % 3]list[2][i / 3 % 2]list[3][i % 3]
或:
array[i] = list[0][i / (72 / 4) % 4]list[1][i / (72 / (4 * 3)) % 3]list[2][i / (72 / (4 * 3 * 2)) % 2]list[3][i /(72 / (4 * 3 * 2 * 3)) % 3]
==========================================================================
下列是一个比较死板的代码(因为数组是预先定义好的):
String a[] = {"a1", "a2", "a3", "a4"};
String b[] = {"b1", "b2", "b3"};
String c[] = {"c1", "c2"};
String d[] = {"d1", "d2", "d3"};
int max = a.length * b.length * c.length * d.length;
for (int i = 0; i < max; i++) {
String str1 = a[i / (b.length * c.length * d.length) % a.length] + b[i / (c.length * d.length) % b.length] + c[i / (d.length) % c.length] + d[i % d.length];
System.out.println("第 " + (i + 1) + " 个: " + str1);
}
==========================================================================
再下列是比较灵活的代码,动态的:
String[][] str = {{"a1", "a2", "a3", "a4"},
{"b1", "b2", "b3"},
{"c1", "c2"},
{"d1", "d2", "d3"}}; //这个str可以换成动态的二维数组,或者list[]
int max = 1;
for(int i = 0; i < str.length; i++){
max *= str[i].length;
}
for(int i = 0; i < max; i++){
String s = "";
int temp = 1; //注意这个temp的用法。
for(int j = 0; j < str.length; j++){
temp *= str[j].length;
s += str[j][i / (max / temp) % str[j].length];
}
System.out.println("第 " + (i + 1) + " 个: " + s);
}
System.out.println(max);
以上就是二维数组的排列组合方法。我不是数学天才,所以方法是按照正常的逻辑思维推导出来写的,估计肯定有效率极高、超级漂亮的算法,如果哪位仁兄看到我这篇文章,又恰巧知道更为漂亮的算法,希望不吝赐教。大家进步社会才会进步么。呵呵,说多了。
分享到:
相关推荐
主要介绍了C#实现对二维数组排序的方法,实例分析了C#数组遍历与排序的相关技巧,需要的朋友可以参考下
// 二维数组冒泡排序 public static void main(String[] args) { int i=0, j=0, temp = 0; int[][] nums1 = { { 34, 1, 22, 5 }, { 28, 98, 15, 32 }, { 33, -5, 17, 41 } }; int rows = nums1.length; //二维...
VB.NET二维数组快速排序(更新) 'OldArrays(),为排序二维数组;NewArrays(),为存放结果数组,SortColumnsOrOrders(),传递排序参数数组,偶数个为排序列号,奇数为升降序,0为升序,1为降序;FieldRow,是否有字段行...
不要看分数高,这个程序绝对可以对得起大家的分数。这个楼主的研究哈!反正下了评价后分数可以返还的................
二维数组排序.vi
二维数组的排序,其中包含冒泡排序、选择排序、插入排序和快速选择排序。
VB二维数组排序源码
使用冒泡排序实现的java语言编写的关于二维数组的排序,实现了行、列的排序输出。
用labview在While循环中实现二维数组的逐行排序,用两个for循环
思路以及注意点、说明我都加在了代码旁边的注释里,好好悟悟!
c++ c语言编写 二维数组的 冒泡排序 范例
二维数组排序.zip源码Labview个人项目资料程序资源下载二维数组排序.zip源码Labview个人项目资料程序资源下载二维数组排序.zip源码Labview个人项目资料程序资源下载二维数组排序.zip源码Labview个人项目资料程序资源...
1/根据两点4个值,以及一个x,求插值y 2/根据二维数组的第一列数值大小排序(降序) 3/根据二维数组的第一列数值大小排序(升序) 4/根据许多个点,以及一个x,求插值y
在实际应用,我们经常要用对二维数组中的某一行或者某一列进行排序,然后其他位置要跟排序一起变动
VB.NET二维数组快速排序: OldArrays(),为排序二维数组;NewArrays(),为存放结果数组;Header,是否有标题行;SortColumnsOrOrders(),传递排序参数数组,奇数个为排序列号,偶数为升降序,0为升序,1为降序
php对二维数组按数组键值进行排序 @param array $array 要排序的数组 @param string $key 排序依据字段 @param string $order 排序方式,0为降序,1为升序
使用php对二维数组按数组值进行排序,由于使用[]形式,因此要求PHP版本>5.4,要移植到其它版本请随便
我学习java的实践,基于堆的二维数组排序