龙空技术网

java使用递归实现组合,从集合中取n

万物生的好物 122

前言:

目前看官们对“java 递归省市区”大约比较注意,咱们都想要学习一些“java 递归省市区”的相关资讯。那么小编也在网络上搜集了一些对于“java 递归省市区””的相关资讯,希望咱们能喜欢,各位老铁们快快来学习一下吧!

有一个需求,从一个集合中取n个元素,组成多个n元素的组合,m中取n,可以拆分为先取1个,然后从m-1中取n-1,一直递归下去,直到n为1,此时完成了一个组合的取数。

代码如下:

public class DoubleBall {		public static void main(String[] args) {				comby();	}			public static void comby(){				int[] dm=new int[]{3,7,10};				int[] tm=new int[]{12,15,21,23,24,30};				List<List<Integer>> all =new ArrayList<>();		List<Integer> curr =new ArrayList<>();		cmn(all, curr, tm, tm.length, 3);		System.out.println("*************************");		int count=0;		for(List<Integer> a:all){			for(Integer i:a){				System.out.print(i+" ");			}			System.out.println();			count++;		}		System.out.print("*************总组合数************"+all.size());			}		/**	 * 从m中取n,实现m取n的组合	 * @param all  用来放所有组合的集合	 * @param curr 当前已经取好的 n-1个元素的组合	 * @param arr 原始数组	 * @param m 	 * @param n 	 */	public static void cmn( List<List<Integer>> all,   List<Integer> curr,int [] arr,int m,int n){				//m中取n		if(n==1){			for(int i:arr){				List<Integer> list=new ArrayList<>();				list.addAll(curr);				list.add(i);				//排序元素				Collections.sort(list);				//将不包含的组合加入集合中				if(!containComby(all, list)){					all.add(list);				}							}			return ;		}		for(int i=0;i<arr.length;i++){			int [] arr2=new int[arr.length-1];			List<Integer> list=new ArrayList<>();			list.addAll(curr);			list.add(arr[i]);			int k=0;			for(int j=0;j<arr.length;j++){				if(j!=i){					arr2[k++]=arr[j];				}							}				cmn(all, list, arr2, m-1, n-1);		}									}	/**	 * 判断集合中是否包含相同的子集合	 * @param all	 * @param curr	 * @return	 */	public static boolean containComby(List<List<Integer>> all,List<Integer> curr){				for(List<Integer> ls:all){			int i=0;			for(;i<ls.size();i++){							if(!ls.get(i).equals(curr.get(i))){					break;				}			}			if(i>=ls.size()){				return true;			}		}		return false;	}				}

运行结果:

标签: #java 递归省市区