包裹分箱 算法
程序员文章站
2022-07-03 12:52:34
...
包裹 分箱简单算法 算出临界值 分箱数量加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; } }