1.代码

  1. package com.hdwang;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.List;
  6.  
  7. /**
  8. * Created by hdwang on 2017-10-25.
  9. * 组合、排列、可重复排列
  10. */
  11. public class CombineAndArrangement {
  12.  
  13. private static ArrayList<Integer> tmpArr = new ArrayList<>();
  14. public static void main(String[] args) {
  15. int [] com = {1,2,3,4};
  16. int k = 3;
  17. if(k > com.length || com.length <= 0){
  18. return ;
  19. }
  20. System.out.println("组合结果:");
  21. combine(0 ,k ,com);
  22. System.out.println("\n排列结果:");
  23. arrangement(k,com);
  24. System.out.println("\n可重复排列结果:");
  25. repeatableArrangement(k, com);
  26. }
  27.  
  28. /**
  29. * 组合
  30. * 按一定的顺序取出元素,就是组合,元素个数[C arr.len 3]
  31. * @param index 元素位置
  32. * @param k 选取的元素个数
  33. * @param arr 数组
  34. */
  35. public static void combine(int index,int k,int []arr) {
  36. if(k == 1){
  37. for (int i = index; i < arr.length; i++) {
  38. tmpArr.add(arr[i]);
  39. System.out.print(tmpArr.toString() + ",");
  40. tmpArr.remove((Object)arr[i]);
  41. }
  42. }else if(k > 1){
  43. for (int i = index; i <= arr.length - k; i++) {
  44. tmpArr.add(arr[i]); //tmpArr都是临时性存储一下
  45. combine(i + 1,k - 1, arr); //索引右移,内部循环,自然排除已经选择的元素
  46. tmpArr.remove((Object)arr[i]); //tmpArr因为是临时存储的,上一个组合找出后就该释放空间,存储下一个元素继续拼接组合了
  47. }
  48. }else{
  49. return ;
  50. }
  51. }
  52.  
  53. /**
  54. * 排列
  55. * 按照无序(随机)的方式取出元素,就是排列,元素个数[A arr.len 3]
  56. * @param k 选取的元素个数
  57. * @param arr 数组
  58. */
  59. public static void arrangement(int k,int []arr){
  60. if(k == 1){
  61. for (int i = 0; i < arr.length; i++) {
  62. tmpArr.add(arr[i]);
  63. System.out.print(tmpArr.toString() + ",");
  64. tmpArr.remove((Object)arr[i]);
  65. }
  66. }else if(k > 1){
  67. for (int i = 0; i < arr.length; i++) { //按顺序挑选一个元素
  68. tmpArr.add(arr[i]); //添加选到的元素
  69. arrangement(k - 1, removeArrayElements(arr, tmpArr.toArray(new Integer[1]))); //没有取过的元素,继续挑选
  70. tmpArr.remove((Object)arr[i]);
  71. }
  72. }else{
  73. return ;
  74. }
  75. }
  76.  
  77. /**
  78. * 可重复排列
  79. * 类似自己和自己笛卡尔积,类似k层循环拼接的结果,元素个数[arr.len^3]
  80. * @param k 选取的元素个数(k层循环)
  81. * @param arr 数组
  82. */
  83. public static void repeatableArrangement(int k,int []arr){
  84. if(k==1){
  85. for(int i=0;i<arr.length;i++){
  86. tmpArr.add(arr[i]);
  87. System.out.print(tmpArr.toString() + ",");
  88. tmpArr.remove(tmpArr.size()-1); //移除尾部元素
  89. }
  90. }else if(k >1){
  91. for(int i=0;i<arr.length;i++){
  92. tmpArr.add(arr[i]);
  93. repeatableArrangement(k - 1, arr); //不去重
  94. tmpArr.remove(tmpArr.size()-1); //移除尾部元素,不能用remove(Object),因为它会移除头部出现的元素,我们这里需要移除的是尾部元素
  95. }
  96. }else{
  97. return;
  98. }
  99. }
  100.  
  101. /**
  102. * 移除数组某些元素(不影响原数组)
  103. * @param arr 数组
  104. * @param elements 待移除的元素
  105. * @return 剩余元素组成的新数组
  106. */
  107. public static int[] removeArrayElements(int[] arr, Integer... elements){
  108. List<Integer> remainList = new ArrayList<>(arr.length);
  109. for(int i=0;i<arr.length;i++){
  110. boolean find = false;
  111. for(int j=0;j<elements.length;j++){
  112. if(arr[i] == elements[j]){
  113. find = true;
  114. break;
  115. }
  116. }
  117. if(!find){ //没有找到的元素保留下来
  118. remainList.add(arr[i]);
  119. }
  120. }
  121. int[] remainArray = new int[remainList.size()];
  122. for(int i=0;i<remainList.size();i++){
  123. remainArray[i] = remainList.get(i);
  124. }
  125. return remainArray;
  126. }
  127. }

2.运行结果

  1.  

组合结果:
[1, 2, 3],[1, 2, 4],[1, 3, 4],[2, 3, 4],
排列结果:
[1, 2, 3],[1, 2, 4],[1, 3, 2],[1, 3, 4],[1, 4, 2],[1, 4, 3],[2, 1, 3],[2, 1, 4],[2, 3, 1],[2, 3, 4],[2, 4, 1],[2, 4, 3],[3, 1, 2],[3, 1, 4],[3, 2, 1],[3, 2, 4],[3, 4, 1],[3, 4, 2],[4, 1, 2],[4, 1, 3],[4, 2, 1],[4, 2, 3],[4, 3, 1],[4, 3, 2],
可重复排列结果:
[1, 1, 1],[1, 1, 2],[1, 1, 3],[1, 1, 4],[1, 2, 1],[1, 2, 2],[1, 2, 3],[1, 2, 4],[1, 3, 1],[1, 3, 2],[1, 3, 3],[1, 3, 4],[1, 4, 1],[1, 4, 2],[1, 4, 3],[1, 4, 4],[2, 1, 1],[2, 1, 2],[2, 1, 3],[2, 1, 4],[2, 2, 1],[2, 2, 2],[2, 2, 3],[2, 2, 4],[2, 3, 1],[2, 3, 2],[2, 3, 3],[2, 3, 4],[2, 4, 1],[2, 4, 2],[2, 4, 3],[2, 4, 4],[3, 1, 1],[3, 1, 2],[3, 1, 3],[3, 1, 4],[3, 2, 1],[3, 2, 2],[3, 2, 3],[3, 2, 4],[3, 3, 1],[3, 3, 2],[3, 3, 3],[3, 3, 4],[3, 4, 1],[3, 4, 2],[3, 4, 3],[3, 4, 4],[4, 1, 1],[4, 1, 2],[4, 1, 3],[4, 1, 4],[4, 2, 1],[4, 2, 2],[4, 2, 3],[4, 2, 4],[4, 3, 1],[4, 3, 2],[4, 3, 3],[4, 3, 4],[4, 4, 1],[4, 4, 2],[4, 4, 3],[4, 4, 4],

JAVA实现组合、排列、重复排列(多层循环)的更多相关文章

  1. Java的组合排列问题

    从4个人中选2个人参加活动,一共有6种选法. 从n个人中选m个人参加活动,一共有多少种选法?C(m/n)=C((m-1)/(n-1))+C(m/(n-1))数学算法 public class Main ...

  2. java的break跳出多层循环

    记得大一的时候,语言学的不好,碰到了需要跳出双层循环的时候,就没有了办法.因为老师讲了goto然后说不要用goto...  自己就一直感觉这种跳出多层循环的想法是不可取的(好蠢) 下面用java代码的 ...

  3. JAVA如何跳出多层循环

    1. break.continue.return 的区别: break默认是跳出最里层的循环,也就是break所在的最近的那层循环 continue是终止本次循环,继续下次循环 return 结束当前 ...

  4. Java语法基础(四)----循环结构语句

    一.循环结构: 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则 ...

  5. 关于python如何简单跳出多层循环

    上述代码的逻辑是,在跳出子循环之前定义一个变量flag为Ture,第一层循环跳出之后,如果要跳出第二个循环,直接调用变量flag,可以直接跳出第二层循环.这里要注意的是缩进,不然会出错误. 如果是多层 ...

  6. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  7. 九天学会Java,第四天,循环结构

    变量和数据类型,赋值和输出 算术运算 选择结构 循环结构 函数定义,函数调用 变量作用域 栈,程序运行的基石 面向对象 异常处理 语言提供的公用包 这次我们讲Java的循环结构.循环结构在编程中广泛使 ...

  8. Java中组合 设计技巧 实例

    关于组合 和 集成 先放两篇文章:这两篇文章写的太好了. http://blog.csdn.net/u013905744/article/details/51752044    Java的组合(持有对 ...

  9. js 对于jquery each 多层循环的问题和原生js多层循环问题

    一.在jquery中,我们使用循环的时候,提供两种方式:jquery.each 和(循环体).each  两种方式不是同. 对于return 在作用这两个的函数的时候需要注意: 首先我们需要知道我们的 ...

  10. sql中多层循环示例(有游标)

    在需求处理中,我们会遇到需要通过SQL多层循环来处理的问题.如:A表中有8条数据,B表中有10条数据,需要实现A表中的每1条数据对应B表中的10条数据,最后就有了80条数据,从而实现一对多的关系.那如 ...

随机推荐

  1. 20155321 《网络攻防》 Exp7 网络欺诈防范

    20155321 <网络攻防> Exp7 网络欺诈防范 实验内容 简单应用SET工具建立冒名网站 因为钓鱼网站是在本机的http服务下使用,因此需要将SET工具的访问端口改为http默认的 ...

  2. jsp页面中日期的格式化

            在一次开发中,由于数据库中生日采用的是datetime的数据类型,因此数据库中数据格式为:2017-07-11 00:00:00. 但是,编辑页面中回显生日肯定是不可以显示出时分秒的, ...

  3. ElasticSearch入门 第三篇:索引

    这是ElasticSearch 2.4 版本系列的第三篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  4. ASP.NetCore2.0概览

      微软为了统一微软平台,造就了.netStandard,不管之前的Framework还是最新的.netCore都必须支持.netStandard标准来统一各个平台的开发api. 以下是之前的微软各个 ...

  5. RabbitMQ使用注意

    1.通常发布者发布结束后会释放Channel,但是消费者由于是异步监听,消费者的Channel不可以释放,否则就断开连接无法监听. 2.当使用默认配置时,ConnectionFactory不指定Por ...

  6. OAuth 2.0 Salesforce & Azure

    最近在学习Salesforce,浅谈一下 OAuth 2.0 在Salesforce and Azure 之间的应用. 假设有这样一个场景,在Salesforce中需要用到Azure中的一些服务,那么 ...

  7. Ajax实例OR技术原理 转自 (http://blog.csdn.net/evankaka )

    摘要:AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.AJAX 是一种用于创建快速动态网页的 ...

  8. Intellij IDEA 文件修改提示星号

    https://www.cnblogs.com/zheting/p/7594073.html

  9. java第二次实验报告

    课程:Java实验   班级:201352     姓名:池彬宁  学号:20135212 成绩:             指导教师:娄佳鹏   实验日期:15.05.05 实验密级:         ...

  10. c# dataGridView 表头格式设置不管用

    解决办法: EnableHeaderVisualStyles设为false