排列组合:
排列组合是组合学最基本的概念。所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序。组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。排列组合的中心问题是研究给定要求的排列和组合可能出现的情况总数。 排列组合与古典概率论关系密切。
实现功能:
数据源有多个数组,从每个数组中获取一个值,组成一个结果集,列出所有的结果集.
例如:
多个数组:
{"name1","name2","name3"}
{"age1","age2","age3"}
{"weight1","weight2","weight3"}
其中的一个结果集:
{age1, name1, weight1}
实现代码如下:
业务回调接口类:
public interface IBiz {
/**
* 具体业务处理
* @param params
*/
public void deal(Map<String, Object> params);
}
算法实现类:
public class PartsUtil {
/**
* 排列组合
* @param i 起始值
* @param keys key值集合
* @param values value值集合
* @param ret 结果
* @param iBiz 业务处理接口
*/
public static void parts(int i,List<String> keys,List<Object[]> values,Map<String,Object> ret,IBiz iBiz){
// 集合的长度
Integer valSize = values.size();
if(i >= valSize){
return;
}
if(ret == null){
ret = new HashMap<String, Object>();
}
Object[] objects = values.get(i);
int m = i + 1;
for (Object object : objects){
Map<String,Object> subRet = new Hashtable<String, Object>();
subRet.putAll(ret);
subRet.put(keys.get(i),object);
if(i >= (valSize-1)){
iBiz.deal(subRet);
}
parts(m, keys, values, subRet, iBiz);
}
}
/**
* 排列组合
* @param map 组合排列的值
* @param iBiz 业务处理接口
*/
public static void parts(Map<String,Object[]> map,IBiz iBiz){
List<String> keys = new ArrayList<String>();
List<Object[]> values = new ArrayList<Object[]>();
for(String key : map.keySet()){
keys.add(key);
values.add(map.get(key));
}
parts(0, keys, values, null, iBiz);
}
}
测试类:
public class TestPartsUtil {
public static void main(String[] args) {
// 记录次数
final Map<String,Integer> cntMap = new HashMap<String, Integer>();
cntMap.put("cnt",0);
Map<String,Object[]> map = new HashMap<String,Object[]>();
map.put("name",new String[]{"name1","name2","name3"});
map.put("age",new String[]{"age1","age2","age3"});
map.put("weight",new String[]{"weight1","weight2","weight3"});
PartsUtil.parts(map, new IBiz() {
@Override
public void deal(Map<String, Object> params) {
cntMap.put("cnt", cntMap.get("cnt") + 1);
System.out.println(cntMap.get("cnt") + ":" + params);
}
});
}
}