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 );
}
}
}
} |