• 排列组合生成多种组合的工具类


    package test;

    import java.util.ArrayList;
    import java.util.List;

    /**
    * Description: 字符串组合拼接工具
    * n个数选m个组合问题
    *
    * @author: echoogai
    * @version: 1.0
    */
    public class CharlesGaiUtil {
    public List combine(int[] a, int m) {
    int n = a.length;
    if (m > n) {
    throw new RuntimeException("操作非法:一共只有" + n + "个元素,无法选取 " + m + "个");
    }

    List result = new ArrayList();

    int[] bs = new int[n];
    for (int i = 0; i < n; i++) {
    bs[i] = 0;
    }
    //初始化
    for (int i = 0; i < m; i++) {
    bs[i] = 1;
    }
    boolean flag = true;
    boolean tempFlag = false;
    int pos = 0;
    int sum = 0;
    //首先找到第一个10组合,然后变成01,同时将左边所有的1移动到数组的最左边
    do {
    sum = 0;
    pos = 0;
    tempFlag = true;
    result.add(print(bs, a, m));

    for (int i = 0; i < n - 1; i++) {
    if (bs[i] == 1 && bs[i + 1] == 0) {
    bs[i] = 0;
    bs[i + 1] = 1;
    pos = i;
    break;
    }
    }

    //将左边的1全部移动到数组的最左边
    for (int i = 0; i < pos; i++) {
    if (bs[i] == 1) {
    sum++;
    }
    }
    for (int i = 0; i < pos; i++) {
    if (i < sum) {
    bs[i] = 1;
    } else {
    bs[i] = 0;
    }
    }

    //检查是否所有的1都移动到了最右边
    for (int i = n - m; i < n; i++) {
    if (bs[i] == 0) {
    tempFlag = false;
    break;
    }
    }
    if (tempFlag == false) {
    flag = true;
    } else {
    flag = false;
    }

    } while (flag);
    result.add(print(bs, a, m));

    return result;
    }

    private int[] print(int[] bs, int[] a, int m) {
    int[] result = new int[m];
    int pos = 0;
    for (int i = 0; i < bs.length; i++) {
    if (bs[i] == 1) {
    result[pos] = a[i];
    pos++;
    }
    }
    return result;
    }

    private void print(List l) {
    for (int i = 0; i < l.size(); i++) {
    int[] a = (int[]) l.get(i);
    for (int j = 0; j < a.length; j++) {
    System.out.print(a[j] + " ");
    }
    System.out.println();
    }
    }

    private void combineCharacter(String[] strings, List list, String replace) {
    for (int i = 0; i < list.size(); i++) {
    int[] a = (int[]) list.get(i);
    System.out.println(doCombine(strings, a, replace));
    }
    }

    private String doCombine(String[] strings, int[] sel, String replace) {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i <strings.length; i++) {
    boolean find = false;
    for (int j=0; j<sel.length; j++) {
    if(i == sel[j]) {
    find = true;
    break;
    }
    }
    if(find) {
    sb.append(replace);
    } else {
    sb.append(strings[i]);
    }
    if(i<strings.length - 1) {
    sb.append("_");
    }
    }
    return sb.toString();
    }

    public static void main(String[] args) {
    String string = "840210_200502_D_2";
    String[] strings = string.split("_");
    int m = strings.length - 1;
    CharlesGaiUtil charlesGaiUtil = new CharlesGaiUtil();

    int[] index = new int[m];
    for (int i = 0; i < m; i++) {
    index[i] = i + 1;
    }

    // 全不替换情况
    System.out.println(string);
    // 1 ~ m-1 情况
    List list = null;
    for(int i=1; i<m; i++) {
    list = charlesGaiUtil.combine(index, i);
    charlesGaiUtil.combineCharacter(strings, list, "%");
    }
    //全选情况
    list.clear();
    list.add(index);
    charlesGaiUtil.combineCharacter(strings, list, "%");
    }

    }

  • 相关阅读:
    Day10 python基础---函数进阶
    Day9 python基础---函数初识
    Day8 python基础
    Day7 python基础
    Day6 python基础
    Day5 python基础
    Day4 python基础
    Day3 python基础
    TensorFlow学习笔记5-概率与信息论
    TensorFlow学习笔记6-数值计算基础
  • 原文地址:https://www.cnblogs.com/curedfisher/p/12484791.html
Copyright © 2020-2023  润新知