参数的排列组合3

简介:

场景描述:

我有个测试同事,要测试一个接口,这个接口有多个参数,而且有的参数取值有多个.

比如参数method,可以取值["a","b","c"],并且个数不确定,即method,可以取值ab,也可是是abc

如何获取排列组合的所有值呢? 
之前咱们是求排列组合的取值个数,现在要求取值 
首先我们考虑常规的情况: 
我们有n个盒子,分别放置n个元素 
第一回:我们从n个里面选择一个:有n种可能 
第二回:我们从n-1个里面选择一个:有n-1种可能 
第三回:我们从n-2个里面选择一个:有n-2种可能 
第四回:我们从n-3个里面选择一个:有n-3种可能 
…… 
最后我们只有一个可选 



 直接上代码:直接上代码:

Java代码   收藏代码
  1. /*** 
  2.     * @param base      :[a,b,c,d] 
  3.     * @param times 
  4.     * @param remaining : 剩余要选择的个数 
  5.     * @return 
  6.     */  
  7.    public static void assemble(List<String> result, StringBuffer buffer, String base[], int times, int remaining, boolean isSort) {  
  8.        if (remaining <= 1) {  
  9.            buffer.append(base[base.length - 1]);  
  10.            if(times==0||times==base.length-remaining+1){  
  11.             addElementBySort(result, buffer, isSort);  
  12.            }  
  13.              
  14.        } else {  
  15.            for (int i = 0; i < remaining; i++) {  
  16.                StringBuffer bufferTmp = new StringBuffer(buffer);  
  17.                bufferTmp.append(base[base.length - 1 - i]);  
  18.                if(times==0||times==base.length-remaining+1){  
  19.                 addElementBySort(result, bufferTmp, isSort);  
  20.                }  
  21.                assemble(result, bufferTmp, SystemHWUtil.aheadElement(base, base.length - 1 - i), times, remaining - 1, isSort);  
  22.            }  
  23.        }  
  24.   
  25.    }  

 参数说明:

参数名 含义 举例
base 样本 [a,b,c,d]
remaining 剩余可选择的样本个数  
times 组合的个数  



 

工具类完整代码:

Java代码   收藏代码
  1. package com.common.util;  
  2.   
  3. import com.string.widget.util.ValueWidget;  
  4.   
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7.   
  8. /** 
  9.  * Created by huangweii on 2016/1/23. 
  10.  */  
  11. public class AssembleUtil {  
  12.     /*** 
  13.      * @param base      :[a,b,c,d] 
  14.      * @param times 
  15.      * @param remaining : 剩余要选择的个数 
  16.      * @return 
  17.      */  
  18.     public static void assemble(List<String> result, StringBuffer buffer, String base[], int times, int remaining, boolean isSort) {  
  19.         if (remaining <= 1) {  
  20.             buffer.append(base[base.length - 1]);  
  21.             if(times==0||times==base.length-remaining+1){  
  22.                 addElementBySort(result, buffer, isSort);  
  23.             }  
  24.               
  25.         } else {  
  26.             for (int i = 0; i < remaining; i++) {  
  27.                 StringBuffer bufferTmp = new StringBuffer(buffer);  
  28.                 bufferTmp.append(base[base.length - 1 - i]);  
  29.                 if(times==0||times==base.length-remaining+1){  
  30.                     addElementBySort(result, bufferTmp, isSort);  
  31.                 }  
  32.                 assemble(result, bufferTmp, SystemHWUtil.aheadElement(base, base.length - 1 - i), times, remaining - 1, isSort);  
  33.             }  
  34.         }  
  35.   
  36.     }  
  37.   
  38.     /*** 
  39.      * @param base 
  40.      * @param times 
  41.      * @param isSort    : 是否对"acb"进行排序,<br />排序结果:"abc" 
  42.      * @return 
  43.      */  
  44.     public static List<String> assemble(String base[], int times,  boolean isSort) {  
  45. //        Set<String> result = new HashSet<String>();  
  46.         List<String> result = new ArrayList<String>();  
  47.         AssembleUtil.assemble(result, new StringBuffer(), base, times, base.length, true);  
  48.         return result;  
  49.     }  
  50.   
  51.     public static void addElementBySort(List<String> result, StringBuffer buffer, boolean isSort) {  
  52.         String str = buffer.toString();  
  53.         if (isSort) {  
  54.             str = ValueWidget.sortStr(str);  
  55.         }  
  56.         if (result.size() == 0 || (!result.contains(str))) {  
  57.             result.add(str);  
  58.         }  
  59.     }  
  60.   
  61.     /*** 
  62.      * 参数的取值个数,ab和ba算一种 
  63.      * 
  64.      * @param argCount 
  65.      * @return 
  66.      */  
  67.     public static int getAssembleSum(int argCount) {  
  68.         int sum = 0;  
  69.         for (int i = 0; i < argCount; i++) {  
  70.             int count = i + 1;//参数组合的个数  
  71.             sum += (SystemHWUtil.factorial(argCount, count) / SystemHWUtil.arrayArrange(count));  
  72.         }  
  73.         return sum;  
  74.     }  
  75.   
  76. }  


相关文章
|
7月前
|
人工智能 算法 数据可视化
【算法训练-数组 五】【数组组合】:下一个排列
【算法训练-数组 五】【数组组合】:下一个排列
52 0
|
存储 算法
四式解决回溯算法:组合+组合总和
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
698 3
|
存储 算法
一文搞懂全排列、组合、子集问题
Hello,大家好,我是bigsai,long time no see!在刷题和面试过程中,我们经常遇到一些排列组合类的问题,而全排列、组合、子集等问题更是非常经典问题。本篇文章就带你彻底搞懂全排列!
190 0
一文搞懂全排列、组合、子集问题
|
存储 算法 容器
Leetcode 76最小覆盖子串&77组合&78子集
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
121 0
Leetcode 76最小覆盖子串&77组合&78子集
【组合数学】生成函数 ( 使用生成函数求解不定方程解个数示例 2 | 扩展到整数解 )
【组合数学】生成函数 ( 使用生成函数求解不定方程解个数示例 2 | 扩展到整数解 )
190 0
|
机器学习/深度学习 移动开发
【组合数学】排列组合 ( 集合组合、一一对应模型分析示例 )
【组合数学】排列组合 ( 集合组合、一一对应模型分析示例 )
202 0
|
机器学习/深度学习 移动开发
【组合数学】排列组合 ( 集合排列、分步处理示例 )
【组合数学】排列组合 ( 集合排列、分步处理示例 )
188 0
|
机器学习/深度学习 人工智能
【集合论】容斥原理 ( 包含排斥原理 | 示例 )
【集合论】容斥原理 ( 包含排斥原理 | 示例 )
295 0
【组合数学】生成函数 ( 正整数拆分 | 无序不重复拆分示例 )
【组合数学】生成函数 ( 正整数拆分 | 无序不重复拆分示例 )
327 0
【组合数学】排列组合 ( 排列组合示例 )
【组合数学】排列组合 ( 排列组合示例 )
296 0