多订单多支付方式分配金额问题
来源:互联网 发布:淘宝电话人工服务电话 编辑:程序博客网 时间:2024/06/06 17:42
算是个面试题吧,问题描述是这样:多个业务订单,对应一个支付单进行支付,支付时使用了组合支付。那么没个订单分配到的支付方式及金额如何计算。
一共三个支付方式组合A,B,C金额分辨占100,100,80.
一共两个订单1订单金额80,2订单金额200.
分配后,产生4份订单和支付方式不同的数据。
画个图明了一点:
问题抽象:
我们发现图一和图二重叠一下不就是图三的分配结果嘛。
可是代码似乎没这么简单就可以操作。
又将问题拟物化,便于理解,将支付方式组合可以想象成不通种类的杯子,而订单组合是不同种类的酒,现在要把酒放到辈子里去。每倒一次算一个订单和支付方式组合的数据。
第一次:1号酒开始到,在A杯子里都倒不满,直接全部倒光。数据为1+A+80
第二次:2号酒倒入A剩下的20雨量满了。数据为2+A+20
第三次:2号酒倒入B杯子,倒满100,2号酒还剩80。数据为2+B+100
第四次:2号酒倒入C杯子,倒满也到光了。数据为2+C+80
我们发现这四次操作就是遍历订单组合的数据,依次去占有剩余支付金额的数据。而2,3,4次是一个迭代的代码过程。
如果你刚好有时间,可以自己用熟悉的代码实现一下,贴出来讨论讨论。
所以一种实现如下:
public class ItemDistribution { private List<Entry> cupList = new ArrayList<>(); /** * 初始化 * @param list */ public ItemDistribution(List<Item> list) { if(list == null || list.size()<=0){ return; } Integer start = 0; Integer end = 0; for(Item item : list){ end = start + item.amount; Entry entry = new Entry(start, end, item.payMethod); start = end; cupList.add(entry); } } /** * 分配 * @param orderIdAmountMap * @return */ public List<Item> getOrderInfoItemList(Map<Integer, Integer> orderIdAmountMap){ if(cupList == null){ return null; } List<Entry> cupTransferList = cupList; List<Item> returnItems = new ArrayList<>(); for (Map.Entry<Integer, Integer> orderIdAmountEntry : orderIdAmountMap.entrySet()) { Integer orderId = orderIdAmountEntry.getKey(); Integer orderAmount = orderIdAmountEntry.getValue(); buildItem(orderId, orderAmount, cupTransferList, returnItems); } return returnItems; } /** * 单个cup分配 * @param orderId * @param orderAmount * @param cupList * @param returnItems */ private void buildItem(Integer orderId, Integer orderAmount, List<Entry> cupList, List<Item> returnItems) { if(IntegerUtil.isZero(orderAmount) || orderId == null){ return; } Entry cup = getLatestCup(cupList); if(cup == null){ return; } Integer remain = cup.end - cup.index; Item item = null; if(remain > orderAmount){ cup.index = cup.start + orderAmount; item = new Item(orderId, orderAmount, cup.payMethod); returnItems.add(item); return; }else{ cup.index = cup.end; item = new Item(orderId, remain, cup.payMethod); returnItems.add(item); orderAmount = orderAmount - remain; } buildItem(orderId, orderAmount, cupList, returnItems); } /** * 获得可用的cup * @param cupTransferList * @return */ private Entry getLatestCup(List<Entry> cupTransferList){ for(Entry cup : cupTransferList){ if(!IntegerUtil.isEquals(cup.index, cup.end)){ return cup; } } return null; } public class Entry{ private Integer start; private Integer end; private Integer index = 0; private Integer payMethod; public Entry(Integer start, Integer end, Integer payMethod) { this.start = start; this.index = start; this.end = end; this.payMethod = payMethod; } } public static void main(String[] args) { List<Item> list = new ArrayList<Item>(); Item OrderPayInfoItem1 = new Item(100,1); Item OrderPayInfoItem2 = new Item(100,2); Item OrderPayInfoItem3 = new Item(80,3); list.add(OrderPayInfoItem1); list.add(OrderPayInfoItem2); list.add(OrderPayInfoItem3); ItemDistribution itemDistribution = new ItemDistribution(list); Map map = new HashMap<>(); map.put(1001, 80); map.put(1002, 200); List<Item> returnList = itemDistribution.getOrderInfoItemList(map); }}
阅读全文
0 0
- 多订单多支付方式分配金额问题
- 多订单多支付方式分配金额问题
- 采购订单支付金额解决方法
- iOS 支付金额计算问题
- magento获取订单支付方式详细说明
- Google支付订单真伪的验证方式
- 购物网站3:订单实体类设计----配送方式--留言--订单--订单联系方式--订单配送信息--订单项--订单状态--支付方式
- magento 为支付方式添加一个 最大金额和最小金额的限制
- google支付被刷问题及服务端订单验证解决方案
- SSH之订单支付
- 36.支付订单
- 订单支付交易
- 实现订单支付方法
- 购物网站28:类型转换器---日期----配送方式----性别----订单状态----支付方式----性别----系统权限
- 记APP支付宝支付客户端请求订单加密信息的问题
- ###Jsp+Servlet购物商城day04.5:支付:订单支付遇到的问题总结。
- 在ecshop提交订单页的支付方式后面加图标的方法
- checkBox多选支付列表的实现(可以跨屏幕实现多选并计算金额)
- 在ubuntu上安装shadowshocks 14.04
- SQLServer 2008以上误操作数据库恢复方法——日志尾部备份
- 详解路径层和裁剪区域应用
- 选项卡左滑喜欢,右滑不喜欢实现AndroidSwipeableCardStack
- python3+matplotlib+tkinter
- 多订单多支付方式分配金额问题
- Codeforces 387E George and Cards【思维+RMQ+二分+树状数组】被卡常= =
- AFN鍜孲DWebImage璇锋眰缃戠粶鍥剧墖鐨勪竴鐐归棶棰-- ITCoderW
- 后缀数组模板
- JEECG 批量添加用户
- 15章 进程间通信之同步(互斥锁、条件变量、读写锁、信号量)
- python接口测试实例
- 替换服务器上应用中的类文件
- 虚幻4材质系统【1】自定义材质节点