配列修羅道:Step03

配列修羅道:Step03 learn

商品名と在庫数を対応表示せよ

問題を見る(javadrillへ)


問題のポイント

2つの配列を同時に走査して、要素同士を対応させる。
商品名の配列と、在庫数の配列。この「並列構造」を処理するには、同じインデックスで両方を見るしかない。
だから i を使い回す。
配列が複数になったとき、ループが“どこを見てるか”を理解できるかどうかが分かれ道だ。


まず、日本語で考えろ

  • 商品名(String[])と在庫数(int[])の配列がある
  • それぞれの配列の i 番目が対応している
  • それを「商品名: 在庫数」の形式で1行ずつ出力する

コメントを書け

// 商品名と在庫数の配列をループで回す
// 同じインデックスの要素を取り出して出力する
// 出力形式は「名前: 数量」

コメントに従ってコードを書け

public static void printStockList(String[] names, int[] stocks) {
    // 商品名と在庫数の配列をループで回す
    for (int i = 0; i < names.length; i++) {
        // 同じインデックスの要素を取り出して出力する
        System.out.println(names[i] + ": " + stocks[i]);
    }
}

コードの解説

同じインデックスの要素が“対応している”という前提で書かれている。
配列を複数扱うとき、どの配列の何がどれに対応しているのかを見失わないことが大事。

for (int i = 0; i < names.length; i++)
商品名の配列をベースにループ。
在庫数の配列も同じ長さであることを前提に、i で両方を同時に参照する。

System.out.println(names[i] + ": " + stocks[i]);
商品名と在庫数を文字列として連結して出力。
"りんご: 10" のようなフォーマットになる。


つまづきやすいポイント

配列の長さはほんとうに同じか?
今回は「同じ長さである」という前提で書いている。
でも実務では、データの不整合で names.length != stocks.length になることがある。

そんなときに stocks[i] を参照すると IndexOutOfBoundsException が発生する。

同時にループさせるときは、常に「長さは一致しているか?」を自問せよ。

names.length を基準にして stocks を回しているが、実際には安全な方の長さを基準にすべき。


teshのひとこと

配列が2つになると、人は混乱する。
でも、考えることは一つだけ。
“同じ i を使って両方から値を引っ張る”──それだけだ。

「名前」と「数」が対応してるんじゃない。
“i番目の名前”と“i番目の数”が、プログラム上で対応してる。

意味のつながりじゃなくて、インデックスの一致がすべてをつなぐ。

Just keep typing, baby.
“意味”はあとからおまえが与えろ。


👉 配列修羅道:全体のステップ構成はこちら

他のステップや学習順序を確認したい場合は、
[配列修羅道:全体のステップ構成] をチェックしてくれ。