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.栈的可以实现字符串的组合排序,那么必然也可以实现数字,字符等的排序。




学无止境,耐心学习。

 

posted @ 2021-07-23 15:40  小墨儿  阅读(1043)  评论(0编辑  收藏  举报