商品名で検索せよ
問題のポイント
検索とは、“一致する何かを探し出す”という行為。
今回の検索対象は「商品名」。
商品の一覧(List)の中から、キーワードに一致するものを探す処理を組む。初めて登場するのが
equals()
による文字列の一致チェック。
== と equals の違いをちゃんと理解しないと、見えないバグを生むぞ。
まず、日本語で考えろ
- Product のリストがある
- その中から「商品名」が一致する商品を探す
- 見つかれば在庫数を表示
- 見つからなければ「該当商品なし」と表示する
コメントを書け
// 見つかったかどうかを記録する変数を用意する
// リストをループして、商品名が一致するか調べる
// 一致したら在庫数を表示して、見つかったフラグを立ててループ終了
// 最後まで見つからなければ「該当商品なし」と表示する
コメントに従ってコードを書け
public class ProductUtil {
public static void searchByName(ArrayList<Product> products, String keyword) {
boolean found = false;
for (int i = 0; i < products.size(); i++) {
Product p = products.get(i);
if (p.getName().equals(keyword)) {
System.out.println(p.getName() + "の在庫数: " + p.getStock());
found = true;
break;
}
}
if (!found) {
System.out.println("該当商品なし");
}
}
}
コードの解説
boolean found = false;
最初は「見つかっていない」前提。
ループ内で見つかったらtrue
に切り替えるためのフラグ。
p.getName().equals(keyword)
商品名と検索キーワードの「中身の比較」をしている。
文字列の比較には==
じゃなくequals()
を使うのが鉄則。
found = true; break;
条件を満たす商品を見つけたら、フラグを立ててループ終了。
無駄に回し続けないことも、コードを設計する上で大事な判断。
if (!found)
最後まで見つからなかった場合だけ表示。
こういう “なかったときの処理” を入れ忘れがちなので注意。
つまづきやすいポイント
文字列比較で
==
を使ってしまう
Javaでは==
は「同じ箱(オブジェクト)か」を調べる。
中身(文字列そのもの)を比べるにはequals()
を使わないと絶対にダメ。
"みかん" == "みかん"
が false になることもある。検索失敗時の処理が抜けがち
「見つかったら出力」は誰でも書けるが、
「見つからなかったときの出力」は忘れやすい。boolean found
を使って、その状況をちゃんと拾っておけ。
teshのひとこと
プログラムは、真か偽かを見分けるためにある。
それをやるのが「比較」だ。
でもな──その比較が間違ってたら、全てがズレる。
==
でバグってるコードを、オレは死ぬほど見てきた。
似てるだけで中身が違うもの──そんな“偽の一致”にダマされんな。
Just keep typing, baby.
コードの真偽は、比べ方で決まる。
他のステップや学習順序を確認したい場合は、
[配列修羅道:全体のステップ構成] をチェックしてくれ。