Home > Java > javaTutorial > Solving the problem of allocating amounts for multiple orders and multiple payment methods in Java

Solving the problem of allocating amounts for multiple orders and multiple payment methods in Java

黄舟
Release: 2017-09-06 09:57:57
Original
3296 people have browsed it

It is considered an interview question. The description of the problem is as follows: Multiple business orders correspond to one payment order, and a combined payment is used during payment. Then how to calculate the payment method and amount assigned to each order.

A total of three payment method combinations A, B, and C account for 100, 100, and 80 respectively.

There are two orders in total. 1 order amount is 80, and 2 order amount is 200.

After allocation, 4 orders and data with different payment methods are generated.

Draw a picture to make it clearer:

Abstract of the problem:

We found that Figure 1 and Figure 2 overlapped and soon after, Figure 3 Assign the results.

But the code doesn’t seem to be that simple to operate.

I have materialized the problem again. The payment method combination can be imagined as different types of cups, and the order combination is different types of wine. Now I want to put the wine into my life. Each countdown counts data for a combination of order and payment method.

The first time: Wine No. 1 started to arrive, but it was not even full in cup A, so it was all poured out. The data is 1+A+80

The second time: Pour No. 2 wine into A and the remaining 20 rain is full. The data is 2+A+20

The third time: Pour No. 2 wine into cup B, fill it with 100, and there is still 80 of No. 2 wine. The data is 2+B+100

The fourth time: Wine No. 2 was poured into cup C, and it was almost empty. The data is 2+C+80

We found that these four operations are to traverse the data of the order combination and occupy the data of the remaining payment amount in turn. And times 2, 3, and 4 are an iterative code process.

If you happen to have time, you can implement it yourself using the code you are familiar with. By the way, I will also collect various implementation methods and ideas.

So one implementation is as follows:

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);
    }
}
Copy after login

The above is the detailed content of Solving the problem of allocating amounts for multiple orders and multiple payment methods in Java. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template