计算多个数字之间的唯一组合,非顺序组合,@杨章隐

175 阅读1分钟
* 最近在做公司的优惠券系统,需求方提出了指定药品的需求,即每个药品随意组合,价格达到门槛了就可以使用优惠券
* 举例:药品有 1、2、3,价格也为1、2、3
* 那么组合就有1、12、123、13、2、23、3 价格分别为 1、3、6、4、2、5、3
* 思路就是每次先拿出数组集合中的第一个数字与其他数字进行配对组合并每次都记录下来得到结果

代码示例

public class Test007 {
    public static void main(String[] args) {
        List<DTO> list = new ArrayList<>();
        DTO dto = new DTO();
        dto.setId("1");
        dto.setPrice(1L);
        list.add(dto);

        dto = new DTO();
        dto.setId("2");
        dto.setPrice(2L);
        list.add(dto);

        dto = new DTO();
        dto.setId("3");
        dto.setPrice(3L);
        list.add(dto);

        dto = new DTO();
        dto.setId("7");
        dto.setPrice(3L);
        list.add(dto);

        dto = new DTO();
        dto.setId("9");
        dto.setPrice(3L);
        list.add(dto);

        List<Result> results = getCombination(list);
    }

    /**
     * 计算所有药品组合 以及组合价格
     * @param array
     * @return
     */
    public static List<Result> getCombination(List<DTO> array){
        List<Result> result = new ArrayList<>();


        int startNum = 0;
        int endNum = array.size();
        List<DTO> DTOS = new ArrayList<>();
        for(int i = startNum ; i < endNum; i ++){
            DTOS.clear();
            DTOS.add(array.get(i));
            //传入节点结果 记录进结果
            getResult(DTOS, result);
            int tempI = i;
            calculation(++ tempI, endNum, DTOS,   array, result);
        }

        return result;
    }

    /**
     * 计算首个药品与其他药品的组合
     * @param start
     * @param end
     * @param drugs
     * @param drugsArray
     * @param result
     */
    public static void calculation(int start, int end, List<DTO> drugs, List<DTO> drugsArray, List<Result> result){
        for(int i = start; i < end; i ++){
            /////////////粗糙解决数组内存地址一样的问题
            List<DTO> dtos = new ArrayList<>();
            for(DTO dto : drugs){
                dtos.add(dto);
            }
            /////////////粗糙解决数组内存地址一样的问题
            dtos.add(drugsArray.get(i));
            //传入节点结果 记录进结果
            getResult(dtos, result);
            int tempI = i;
            calculation(++ tempI, end, dtos, drugsArray, result);
        }
    }


    /**
     * 处理结果 为返回结果赋值
     * @param drugs
     * @param results
     */
    public static void getResult(List<DTO> drugs, List<Result> results){
        Result result = new Result();
        List<Long> ids = new ArrayList<>();
        Long price = 0L;
        for(DTO dto : drugs){
            ids.add(Long.parseLong(dto.getId()));
            price += dto.getPrice();
        }
        result.setIds(ids.toString());
        result.setPrice(price);
        results.add(result);
    }
}


class DTO {
    String id;
    Long price;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Long getPrice() {
        return price;
    }

    public void setPrice(Long price) {
        this.price = price;
    }

}