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

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, "%");
}

}

原文地址:https://www.cnblogs.com/curedfisher/p/12484791.html