欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

包裹分箱 算法

程序员文章站 2022-07-03 12:52:10
...






包裹 分箱简单算法  算出临界值 分箱数量加1
/**
     *预估分箱算法
     * @return
     */
 
  private Tuple2<BigDecimal,Integer>  calculateFareAndNums(List<BigDecimal> list,PxChannelPrice price){
        if(list==null||list.isEmpty()){
            Tuple2.of(BigDecimal.ZERO,0);
        }
        Collections.sort((List<BigDecimal>) list, new Comparator<BigDecimal>() {
            @Override
            public int compare(BigDecimal o1, BigDecimal o2) {
                return o2.compareTo(o1);
            }
        });
        BigDecimal taxSum = BigDecimal.ZERO;//税费
        BigDecimal taxLmt = new BigDecimal(50);//税费限制
        int  bagCnt = 0;//分包数量
        for (int i = 0;i<list.size();i++){
            BigDecimal decimal = list.get(i);

            if(decimal.compareTo(taxLmt)>-1){
                bagCnt++;
            }else {
                if(taxSum.add(decimal).compareTo(taxLmt)>-1){
                    bagCnt++;
                    taxSum = decimal;
                }else{
                    taxSum = taxSum.add(decimal);

                }
            }
        }
        if(taxSum.compareTo(BigDecimal.ZERO)==1){
            bagCnt++;
        }
        return Tuple2.of(new BigDecimal(bagCnt).multiply(price.getInitialWeightPrice()),bagCnt);
 }




public class Tuple2<V1, V2> {

    private final V1 v1;
    private final V2 v2;

    public Tuple2(V1 t1, V2 t2) {
        this.v1 = t1;
        this.v2 = t2;
    }

    public static <V1, V2> Tuple2<V1, V2> of(V1 v1, V2 v2) {
        return new Tuple2<>(v1, v2);
    }

    public V1 _1() {
        return v1;
    }

    public V2 _2() {
        return v2;
    }

    @Override
    public String toString() {
        return "(" + v1 + "," + v2 + ')';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;

        Tuple2<?, ?> tuple2 = (Tuple2<?, ?>) o;

        if (!v1.equals(tuple2.v1))
            return false;
        return v2.equals(tuple2.v2);

    }

    @Override
    public int hashCode() {
        int result = v1.hashCode();
        result = 31 * result + v2.hashCode();
        return result;
    }
}