排列组合生成多种组合的工具类
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] + "\t");
}
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, "%");
}
}
相关文章
- 渗透测试 ( 9 ) --- 社会工程攻击工具 setoolkit
- c# 抓取 js动态生成的HTML的工具:NHtmlUnit
- 最好用的数据库文档生成工具
- 流量回放工具:goreplay实战
- (C++C#类型互转工具)使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明
- osgearth_package切片工具切局部影像或者高程tif无法生成切片问题;切完数据集无法显示问题
- 数仓工具—Hive实战之UDF分词(1)
- 身份证号码工具类
- 可以快速保存、访问和粘贴文本片段的Unity漂亮工具
- 工具--按指定的word模板, 将MySQL数据库表信息导出生成word文档
- 程序员必备推荐一款与Swagger媲美的数据库文档生成工具
- 代码自动生成工具 MyGeneration
- 无线网络实体图生成工具airgraph-ng
- 缩略图信息提取工具vinetto
- 渗透脚本快速生成工具Intersect
- 一个基于GPT模型实现的Git Commit信息自动生成工具
- iOS 移动端生成工具开发
- Java应用调优指南之-工具篇
- Java URL链接动态添加参数,Java URL链接删除参数,UrlUtils链接参数工具类
- 2023年大数据的新前线:20个最佳可视化工具,让你的数据呈现更加炫酷
- UUID生成随机数工具类
- 豆瓣书评--提高书本价值判断力和阅读格局的有力工具
- JVM 问题排查和性能优化常用的 JDK 工具
- 无插件及工具纯java生成验证码
- mini_imagenet 数据集生成工具 (续)
- cesium 之地图贴地量算工具效果篇(附源码下载)
- Intel驱动程序更新工具现严重漏洞,官方发布紧急修复版
- 地图图表生成工具链接
- DBImport v3.5 中文版发布:数据库定时同步及文档生成工具(IT人员必备)