Java で複数の注文と複数の支払い方法に金額を割り当てる問題を解決する
これはインタビューの質問です。問題の説明は次のとおりです。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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4
