20180619
一,交叉组合排列算法:
1、前言:
在项目开发的过程中负责全系统查询检索的一个模块,其中有一个查询方式叫做“交叉组合查询”,与数学中的排列组合类似,因此就开始想看一下这个该怎么写,以下为本人原创文章,转载请标明出处:
https://blog.csdn.net/RobinsStruggle,本人自定为java菜鸟,如有问题指出请指教,不胜感激!
2、模型(例题):
现有A、B、C三组球,每组数量不相同,需要在A、B、C中每组一次拿出一个球,拿出的不能与之前拿出的相等:
A:a1、a2、a3;
B:b1、b2;
C:c1、c2、c3、c4;
如果使用数学那么很快就可以得出结论,如果通过简单代码去实现这一步骤的话那么可用的代码为:
public static void main(String[] args) {
List<String> dataList4A = new ArrayList<String>();
dataList4A.add("a1");
dataList4A.add("a2");
dataList4A.add("a3");
List<String> dataList4B = new ArrayList<String>();
dataList4B.add("b1");
dataList4B.add("b2");
List<String> dataList4C = new ArrayList<String>();
dataList4C.add("c1");
dataList4C.add("c2");
dataList4C.add("c3");
dataList4C.add("c4");
for (String dataSon4A : dataList4A) {
for (String dataSon4B : dataList4B) {
for (String dataSon4C : dataList4C) {
System.out.println(dataSon4A + dataSon4B + dataSon4C);
}
}
}
}
3、扩展:
上面的代码或者思维大概能够满足日常开发需求了,当时该想法还是不符合系统要求,因为系统查询条件的组数也就是说上个例子中球的组数是不确定的,那么如果使用上述的方法去实现的话似乎不太可能,而且极度不灵活,那么能不能开发一个工具类去进行根据传入的组数以及组数据去进行交叉排列组合呢?
刚开始的时候我也是顺着前面所述的思路进行思考的,后来发现可行性不大,所以就开始慢慢摸索这个交叉排列组合的可编程化的规则,于是通过整理发现了一个规则,此处献上我的草稿:
于是通过代码实现,并且封装成了工具类,就有了以下的代码:
排列算法实体类:CombinationEntity.java
排列算法操作类:CombinationPeration.java
该两个算法文件可进行下载(想赚点C币哈哈哈哈,两个C币,望谅解!):
https://download.csdn.net/download/robinsstruggle/10485775