前言:
目前看官们对“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 递归省市区