これはインタビューの質問です。問題の説明は次のとおりです。1 つの支払い注文に複数の業務注文が対応しており、支払い時に合算支払いが使用されます。次に、各注文に割り当てられる支払い方法と金額を計算する方法を説明します。
3つの支払い方法の組み合わせA、B、Cの合計は、それぞれ100、100、80になります。
合計2つの注文: 1つの注文金額は80、2つの注文金額は200です。
配布後、4つの注文。支払い方法ごとに異なるデータが生成されます。
わかりやすくするために絵を描きます:
問題の抽象化:
図 1 と図 2 が重なっていることがわかり、すぐに図 3 の分布結果になります。
しかし、コードの操作はそれほど簡単ではないようです。
支払い方法の組み合わせはさまざまな種類のカップとして想像でき、注文の組み合わせはさまざまな種類のワインになるという問題が再び具体化しました。今、私はワインを生活に取り入れなければなりません。各カウントダウンでは、注文と支払い方法の組み合わせのデータがカウントされます。
初回:ワインNo.1が届き始めましたが、カップAにも満たされていなかったので、全部注ぎました。データは1+A+80
2回目:Aに2番のワインを注ぎ、残り20の雨が満タンになります。データは 2+A+20 です
3 回目: カップ B に No.2 ワインを注ぎ、100 を入れます。まだ No.2 ワインが 80 あります。データは2+B+100です
4回目:ワインNo.2をカップCに注ぎ、ほぼ満杯になりました。データは 2+C+80 です
これら 4 つの操作は、注文の組み合わせのデータを走査し、残りの支払い金額のデータを順番に占有するものであることがわかりました。 2 回目、3 回目、4 回目は反復コード プロセスです。
時間があれば、使い慣れたコードを使用して自分で実装することもできます。ちなみに、さまざまな実装方法やアイデアもまとめます。
実装の 1 つは次のとおりです:
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 中国語 Web サイトの他の関連記事を参照してください。