美文网首页
java排列组合及数量组合

java排列组合及数量组合

作者: 斡旋_ASL | 来源:发表于2022-04-15 10:56 被阅读0次
背景:
现有多种容量机油,且每种机油库存不一定一致,需要找到指定容量机油的组合,
所以有了测试机油组合,以及每种组合对应不同库存组合
测试代码:

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.*;
import java.util.stream.Collectors;

public class Test {

    public static void main(String[] args) {
        List<Oil> list = new ArrayList<>();
        list.add(new Oil(1, 3, 3));
        list.add(new Oil(2, 4, 3));
        list.add(new Oil(3, 5, 7));

        // 所有机油排列组合数据集合
        Set<Set<Oil>> comAll = new HashSet<>();
        for (int c = 1; c <= list.size(); c++) {
            comAll.addAll(combination(list, new ArrayList<>(), c));
        }
        // 所有机油组合和容量组合
        Set<Set<Oil>> all = new HashSet<>();
        for (Set<Oil> oils : comAll) {
            // 针对于一种组合的库存组合
            all.addAll(cntCombination(oils));
        }
        // 测试简单组合
//        cntCombination(new HashSet<>(list));
        System.out.println(all);
    }

    /**
     * 油料的排列组合情况
     */
    private static Set<Set<Oil>> combination(List<Oil> list, List<Oil> temp, int cnt) {
        if (cnt == 1) {
            Set<Set<Oil>> sets = new HashSet<>();
            for (Oil ele : list) {
                Set<Oil> collection = new HashSet<>(temp);
                collection.add(ele);
                sets.add(collection);
            }
            return sets;
        }
        cnt--;
        Set<Set<Oil>> result = new HashSet<>();
        for (int i = 0; i < list.size(); i++) {
            List<Oil> coll = new ArrayList<>(temp);
            List<Oil> tempList = new ArrayList<>(list);
            coll.add(tempList.remove(i));
            result.addAll(combination(tempList, coll, cnt));
        }
        return result;
    }

    /**
     * 油料组合的容量组合情况
     */
    private static Set<Set<Oil>> cntCombination(Set<Oil> ps) {
        Set<Set<Oil>> res = new HashSet<>();
        res.add(ps);
        for (int i = 0; i < ps.size(); i++) {
            List<Oil> temp = new ArrayList<>(ps);
            Oil p = temp.remove(i);
            Set<Set<Oil>> res1 = new HashSet<>(res);
            for (int i1 = 1; i1 <= p.getCnt(); i1++) {
                int finalI = i1;
                res.addAll(res1.stream().map(t -> {
                    Set<Oil> s = t.stream().filter(u -> !Objects.equals(u.getId(), p.getId())).collect(Collectors.toSet());
                    s.add(new Oil(p.getId(), p.getVol(), finalI));
                    return s;
                }).collect(Collectors.toList()));
            }
        }
        return res;
    }

    /**
     * 油料类
     */
    @Data
    @AllArgsConstructor
    public static class Oil {
        /**
         * 油料ID
         */
        private Integer id;
        /**
         * 容量
         */
        private int vol;
        /**
         * 数量
         */
        private int cnt;
    }

}

相关文章

网友评论

      本文标题:java排列组合及数量组合

      本文链接:https://www.haomeiwen.com/subject/tpbfertx.html