1 |
使用之前需要声明一个Combine的对象,调用startCombile方法,可返回想要的组合数或者个数,参数介绍很重要 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 |
<br> public class Combine { private
Object[] oldArr; private
Object[] newArr; private
List<Object[]> list= new
ArrayList<Object[]>(); private
int needLength; private
int count; private
boolean flag; /** * 例如我要在5个数中取个,那么arr就是包含这五个的数组,needLength就是3 * @param arr 要进行的数组 * @param needLength 需要的个数 * @param flag true代表返回一个list,list里包含了所有的组合情况;false代表返回一个数字,这个数字就是所有组合的个数 * @return * 此方法为运行入口 */ public
Object startCombile(Object[] arr, int
needLength, boolean
flag){ this .needLength=needLength; this .oldArr=arr; this .newArr= new
Object[needLength]; this .flag=flag; getCombineResult( this .oldArr.length,needLength); if (flag){ return
list; } else { return
count; } } private
void getCombineResult( int
sum, int length){ //5中3个 sum代表5,length代表3,因为递归,到最后肯定是n个里面取1个,当取1个的时候一层递归就结束了,会返回到上一层继续递归 if (length> 0 ){ for ( int
i=oldArr.length-sum;i<oldArr.length;i++){ newArr[needLength-length]=oldArr[i]; if (length== 1 ){ if (flag){ Object[] myArr= new
Object[needLength]; for ( int
j= 0 ;j<newArr.length;j++){ myArr[j]=newArr[j]; } list.add(myArr); } else { count++; } } sum--; getCombineResult(sum,length- 1 ); } } } } |
原文:http://www.cnblogs.com/byit/p/3709289.html