首頁  >  文章  >  Java  >  Java多訂單多支付方式分配金額問題的解決

Java多訂單多支付方式分配金額問題的解決

黄舟
黄舟原創
2017-09-06 09:57:573289瀏覽

算是個面試題吧,問題描述是這樣:多個業務訂單,對應一個支付單進行支付,支付時使用了組合支付。那麼沒個訂單分配到的付款方式及金額如何計算。

總共三個支付方式組合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);
    }
}

以上是Java多訂單多支付方式分配金額問題的解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn