天天看点

java中的排列组合

1

<code>使用之前需要声明一个combine的对象,调用startcombile方法,可返回想要的组合数或者个数,参数介绍很重要</code>

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

<code>&lt;br&gt;</code>

<code>public</code> <code>class</code> <code>combine {</code>

<code>    </code><code>private</code>

<code>object[] oldarr;</code>

<code>object[] newarr;</code>

<code>list&lt;object[]&gt; list=</code><code>new</code>

<code>arraylist&lt;object[]&gt;();</code>

<code>int</code> <code>needlength;</code>

<code>int</code> <code>count;</code>

<code>boolean</code> <code>flag;</code>

<code>    </code> 

<code>    </code><code>/**</code>

<code>     </code><code>* 例如我要在5个数中取个,那么arr就是包含这五个的数组,needlength就是3</code>

<code>     </code><code>* @param arr  要进行的数组</code>

<code>     </code><code>* @param needlength    需要的个数</code>

<code>     </code><code>* @param flag  true代表返回一个list,list里包含了所有的组合情况;false代表返回一个数字,这个数字就是所有组合的个数</code>

<code>     </code><code>* @return</code>

<code>     </code><code>* 此方法为运行入口</code>

<code>     </code><code>*/</code>

<code>    </code><code>public</code>

<code>object startcombile(object[] arr,</code><code>int</code>

<code>needlength,</code><code>boolean</code>

<code>flag){</code>

<code>        </code><code>this</code><code>.needlength=needlength;</code>

<code>        </code><code>this</code><code>.oldarr=arr;</code>

<code>        </code><code>this</code><code>.newarr=</code><code>new</code>

<code>object[needlength];</code>

<code>        </code><code>this</code><code>.flag=flag;</code>

<code>        </code><code>getcombineresult(</code><code>this</code><code>.oldarr.length,needlength);</code>

<code>        </code><code>if</code><code>(flag){</code>

<code>            </code><code>return</code>

<code>list;</code>

<code>        </code><code>}</code><code>else</code><code>{</code>

<code>count;</code>

<code>        </code><code>}</code>

<code>    </code><code>}</code>

<code>void</code> <code>getcombineresult(</code><code>int</code>

<code>sum,</code><code>int</code> <code>length){</code>

<code>        </code><code>//5中3个 sum代表5,length代表3,因为递归,到最后肯定是n个里面取1个,当取1个的时候一层递归就结束了,会返回到上一层继续递归</code>

<code>        </code><code>if</code><code>(length&gt;</code><code>0</code><code>){</code>

<code>            </code><code>for</code><code>(</code><code>int</code>

<code>i=oldarr.length-sum;i&lt;oldarr.length;i++){</code>

<code>                </code><code>newarr[needlength-length]=oldarr[i];</code>

<code>                </code><code>if</code><code>(length==</code><code>1</code><code>){</code>

<code>                    </code><code>if</code><code>(flag){</code>

<code>                        </code><code>object[] myarr=</code><code>new</code>

<code>                        </code><code>for</code><code>(</code><code>int</code>

<code>j=</code><code>0</code><code>;j&lt;newarr.length;j++){</code>

<code>                            </code><code>myarr[j]=newarr[j];</code>

<code>                        </code><code>}</code>

<code>                        </code><code>list.add(myarr);</code>

<code>                    </code><code>}</code><code>else</code><code>{</code>

<code>                        </code><code>count++;</code>

<code>                    </code><code>}</code>

<code>                </code><code>}</code>

<code>                </code><code>sum--;</code>

<code>                </code><code>getcombineresult(sum,length-</code><code>1</code><code>);</code>

<code>            </code><code>}</code>

<code>}</code>