一集合指定元素组合的条件,求出集合中有多少对组合,集合的元素不重复使用。

最近碰到一个问题,记录一下。问题是:有一个商品集合{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;
    }

}



运行结果


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值