商品名と在庫数を対応表示せよ
問題のポイント
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.
“意味”はあとからおまえが与えろ。他のステップや学習順序を確認したい場合は、
[配列修羅道:全体のステップ構成] をチェックしてくれ。