最近碰到一个问题,记录一下。问题是:有一个商品集合{a,a,a,b,b,c,c,c,c},组合的条件为1个a+1个b+2个c为一个组合。计算出这个这个集合当中有多少对组合。
主要是用List实现的,实现起来还是挺简单的。将集合中相同的元素放入到同一个集合当中。然后再把存有相同元素的集合加入到一个类型为List的大集合当中去。让后对大的集合进行循环,得当一个相同元素的一个,然后从条件map中取得这个元素的条件值。然后对这个元素集合进行循环,结束条件就和map中取得的条件值一样。对最里层集合进行循环时,把集合的元素从集合中移除,然后加入到新的集合当中去。对元素集合进行循环前对集合的大小进行判断,判断集合的size是否达到条件值,如果大于等于条件值则进行循环,否则结束整个循环。
以下代码是一个简单的实现示例
/**
* 计算组合 比如有一个数组{a,a,a,b,b,c,c,c,c}
* 条件为一个a加一个b+两个c为一个组合,计算数组当中有几个组合。(数组中的元素不能重复使用)。
* 实现思路:将数组中相同的元素放入一个数组当中,将原始数组拆分为多个元素相同的数组。然后将这些数组放入到一个列表当中。
* 然后对这个列表进行循环,循环中取出当前数组,对其进行条件判断,
* 例如当前循环到a数组,a元素的条件为1,那么从数组中取出一个a元素,将其加入到新的列表当中。如果数组中的元素个数小于条件值,那么循环结束。
*
* @author lsh
*
*/
public class Test {
private static List<String> strList = new ArrayList<String>();
/**
* 条件Map
*/
private static Map<String, Integer> tjMap = new HashMap<String, Integer>();
static {
strList.add("a");
strList.add("a");
strList.add("a");
strList.add("b");
strList.add("b");
strList.add("c");
strList.add("c");
strList.add("c");
strList.add("c");
tjMap.put("a", 1);
tjMap.put("b", 1);
tjMap.put("c", 2);
}
public static void main(String[] args) {
// 将相同的元素加入到同一个集合当中去
Map<String, List<String>> map = new HashMap<String, List<String>>();
for (String s : strList) {
List<String> sList = map.get(s);
if (sList == null) {
sList = new ArrayList<String>();
sList.add(s);
map.put(s, sList);
} else {
sList.add(s);
map.put(s, sList);
}
}
// 将所有的集合加入到一个集合当中
List<List<String>> tjList = new ArrayList<List<String>>();
Iterator<Entry<String, List<String>>> iterators = map.entrySet()
.iterator();
while (iterators.hasNext()) {
tjList.add(iterators.next().getValue());
}
List<List<String>> zhjgList = new ArrayList<List<String>>();
boolean istrue = true;
ok: while (istrue) {
List<String> list = new ArrayList<String>();
for (List<String> tList : tjList) {
if (tList != null && tList.size() > 0) {
String name = tList.get(0);
Integer tj = tjMap.get(name);
if (tList.size() >= tj) {
Iterator<String> iterator = tList.listIterator();
for (int i = 0; i < tj; i++) {
String s = iterator.next();
iterator.remove();
list.add(s);
}
} else {
istrue = false;
break ok;
}
} else {
istrue = false;
break ok;
}
}
zhjgList.add(list);
}
System.out.println(tjList);
System.out.println(zhjgList);
check(zhjgList, tjMap);
}
public static void check(List<List<String>> zhjgList,
Map<String, Integer> tjMap) {
for (List<String> list : zhjgList) {
boolean issuccess = checktj(list, tjMap);
if (issuccess) {
System.out.println("符合条件的组合" + list);
}
}
}
private static boolean checktj(List<String> list, Map<String, Integer> tjMap) {
boolean issuccess = false;
Map<String, Integer> map = test(list);
Set<Entry<String, Integer>> set = tjMap.entrySet();
for (Entry<String, Integer> entry : set) {
Integer sjsl = map.get(entry.getKey());
if (sjsl != null && sjsl >= entry.getValue()) {
issuccess = true;
} else {
issuccess = false;
}
}
return issuccess;
}
private static Map<String, Integer> test(List<String> list) {
Map<String, Integer> slMap = new HashMap<String, Integer>();
for (String s : list) {
Integer ss = slMap.get(s);
if (ss == null) {
slMap.put(s, 1);
} else {
slMap.put(s, 1 + ss);
}
}
return slMap;
}
}