総合 レジアプリ一気通貫
師範 / 目安 45分
閉店後のハレノヒ珈琲。陽葵さんがカウンターに1日ぶんの伝票を積み上げて、深く息を吸いました。「開店から閉店まで使えるレジ、ついに完成させよう。注文受付・レシート・本日の集計・売れ筋、ぜんぶ!」
道場の10問目、最後の依頼です。
ここまでで、書式を揃えたレシート、キャストで守った1円、メソッドという道具、配列での集計、equals での比較、そして Order クラスを作ってきました。最後の課題は、その道具を1台のレジにまとめることです。新しく覚える構文はありません。持っている道具を、正しい順番で組み上げられるかだけを問います。
伝票には不備もあります。書式が壊れた行、個数が0以下の行。不備で落ちないレジを作ってください。営業中に止まるレジは、レジとは言いません。
完成条件
public static String runRegister(String log) を定義してください。Order クラスも問9と同じ形で用意します。
log は本日の全注文の記録です。1件の注文は 商品名:単価:個数 の形で、注文どうしはカンマで区切られています。
プレーンテキスト
珈琲:450:2,シフォンケーキ:680:1,珈琲:450:1これを1件ずつ Order に変換して配列に持ち、次の3段を改行で連結した1つの文字列を返します。
1段目 レシート — 有効な注文1件につき1行です。商品名を左詰め12文字、小計を右詰め6文字に揃え、末尾に 円 を付けます。
プレーンテキスト
珈琲 900円2段目 合計行 — 合計 3件 2030円 税込 2233円 の形です。件数は有効な注文の件数、合計は小計の総和、税込は合計に消費税10%を掛けて切り捨てた値です。
3段目 売れ筋行 — 売れ筋 珈琲 3点 の形です。個数の合計が最も多い商品名と、その個数です。最多が複数あるときは log の中で先に登場したほうを選びます。
不備の扱いは次のとおりです。どちらも数えず、レシートにも出さず、読み飛ばします。
:で区切った要素が3つでない行- 個数が0以下の行
有効な注文が1件も無いときは、レシートと売れ筋を出さず 合計 0件 0円 税込 0円 の1行だけを返してください。
完成形は次のようになります。
プレーンテキスト
珈琲 900円
シフォンケーキ 680円
珈琲 450円
合計 3件 2030円 税込 2233円
売れ筋 珈琲 3点全角文字は1文字として数えられるので、見た目の幅は商品名によって少しずれます。桁は文字数で揃えるのが %-12s の約束です。
進め方
白紙から書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。
開かずに10分粘って進まないなら、①だけ開けてください。粘る時間そのものには価値がありません。価値があるのは、自分で書いた行が動いた瞬間です。
一息に書こうとすると必ず崩れます。機能一覧をメソッド一覧に変換してください。伝票を Order の配列に変える処理、レシートを組む処理、集計する処理、売れ筋を探す処理。この4つに分けて、1つずつ動かしてから繋ぎます。Order の配列が背骨で、残りはその配列を読むだけの部品になります。
売れ筋は注文の件数ではなく個数の合計です。450円の珈琲を3杯の注文が1件あれば、それは3点として数えます。ここを取り違えると、通らないのに原因が見えません。
これで10問すべてです。陽葵さんは画面に流れたレシートをしばらく黙って見つめ、それから顔を上げて言いました。「ハレノヒ珈琲、レジのDX完了!」
師範が奥から一枚の紙を持って出てきます。そこには Java道場・師範代を允許する と書かれていました。1行のレシートを整形するところから始めて、いまあなたは、店を1日まわす道具を白紙から組み上げられます。
要件
- 問9と同じ形の Order クラス(private フィールド・コンストラクタ・getter・getSubtotal)を用意すること
- runRegister(String log) を public static で定義すること
- log をカンマで分割し、さらにコロンで分割して Order の配列に変換すること
- コロン区切りが3要素でない行と、個数が0以下の行は読み飛ばすこと
- レシートは有効な注文1件につき1行で、商品名を左詰め12文字、小計を右詰め6文字に揃えて末尾に「円」を付けること
- 合計行は「合計 3件 2030円 税込 2233円」の形で、税込は消費税10%を掛けて切り捨てること
- 売れ筋行は「売れ筋 珈琲 3点」の形で、個数の合計が最も多い商品名とその個数を出すこと
- 売れ筋の最多が複数あるときは log の中で先に登場したほうを選ぶこと
- 有効な注文が0件のときは「合計 0件 0円 税込 0円」の1行だけを返すこと
- 3段を改行で連結した1つの文字列を return すること
入出力例
runRegister("珈琲:450:2,シフォンケーキ:680:1,珈琲:450:1") → "珈琲 900円
シフォンケーキ 680円
珈琲 450円
合計 3件 2030円 税込 2233円
売れ筋 珈琲 3点"
runRegister("抹茶ラテ:520:1") → "抹茶ラテ 520円
合計 1件 520円 税込 572円
売れ筋 抹茶ラテ 1点"
runRegister("珈琲:450:1,こわれた行,抹茶ラテ:520:0,シフォンケーキ:680:2") → "珈琲 450円
シフォンケーキ 1360円
合計 2件 1810円 税込 1991円
売れ筋 シフォンケーキ 2点"
runRegister("珈琲:450:2,抹茶ラテ:520:2") → "珈琲 900円
抹茶ラテ 1040円
合計 2件 1940円 税込 2134円
売れ筋 珈琲 2点"
runRegister("こわれた行,珈琲:450:-3") → "合計 0件 0円 税込 0円"ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです