java-无重复的排列组合小技能
测试工作中,或多或少的会遇到很多字段,需要从中取出特定的个数组合的情况,这时候排列组合就能很好的起到提高效率的作用。
下面我们一起来看看代码的实现过程:
package com.practice_03; import java.util.Stack; public class Book_See { //分配一个栈实例 public static Stack<String> stack = new Stack<String>(); //统计有多少中组合方式 static int count = 0; public static void main(String[] args) { String persons[] = {"小红","小明","小黑","小绿","小蓝","小晨"}; combine(persons,3,0,0); //从6个人中选择3个组合,不能出现重复组合,有多少中组合方式 System.out.println("总的无重复组合方式有"+count+"种"); } /** * @param persons 所有参与的人 * @param target 设定组合人数大小,例如:3个人组合 2个人组合 * @param num 当前栈内有多少个元素 * @param index 当前数组对应的下标 * */ private static void combine(String[] persons, int target, int num, int index) { //如果栈内元素个数等于设定的组合个数,打印组合,并计数 if(num == target) { System.out.println(stack); count = count+1; return; } for(int i=index;i<persons.length;i++) { //判断栈内是否已经存在元素 if(!stack.contains(persons[i])) { stack.add(persons[i]); combine(persons, target, num+1, i); stack.pop(); } } } }
代码执行输出结果展示如下:
[小红, 小明, 小黑]
[小红, 小明, 小绿]
[小红, 小明, 小蓝]
[小红, 小明, 小晨]
[小红, 小黑, 小绿]
[小红, 小黑, 小蓝]
[小红, 小黑, 小晨]
[小红, 小绿, 小蓝]
[小红, 小绿, 小晨]
[小红, 小蓝, 小晨]
[小明, 小黑, 小绿]
[小明, 小黑, 小蓝]
[小明, 小黑, 小晨]
[小明, 小绿, 小蓝]
[小明, 小绿, 小晨]
[小明, 小蓝, 小晨]
[小黑, 小绿, 小蓝]
[小黑, 小绿, 小晨]
[小黑, 小蓝, 小晨]
[小绿, 小蓝, 小晨]
总的无重复组合方式有20种
总结:
1.target设置越大,组合的种类越少;
2.栈的可以实现字符串的组合排序,那么必然也可以实现数字,字符等的排序。
学无止境,耐心学习。