配列のfor文の中にif文を入れる文について


閲覧ありがとうございます。  
現在java独学中のプログラミング初心者です。

キーボードから数字一文字を入力し、その数字が配列の中の数字のどれかと一致していれば「アタリ！」、一致していなければ「ハズレ」と表示されるコードを書きたいのですがどう書けば良いのかわからず質問させて頂きました。

[code]

    public class Aaaa {
    
        public static void main(String[] args) {
            // TODO 自動生成されたメソッド・スタブ
            int[] numbers = {3,4,9};
    
            System.out.println("１行の数字を入力してください");
            int input=new java.util.Scanner(System.in).nextInt();
    
    
            for(int a:numbers) {
                if(a==input) {
                    System.out.println("アタリ！");
                }   
                if(a!=input) {
                    System.out.println("ハズレ");
                }
            }
    
        }
    }
    
[/code]

こちらが私が書いたコードなのですが、これだと「9」と入力した場合、

ハズレ  
ハズレ  
アタリ！

と表示されてしまいます。  
どのように改善すればアタリ！とだけ表示されるのでしょうか？

初歩的な質問だとは思いますが、どなたか教えていただけると助かります。  
宜しくお願い致します。




### 解決策

`numbers` に含まれるすべての要素と等しくないと分かってから初めて「ハズレ」と出力するようにしてください。

### 実験

どのようにプログラムが動いているか、具体的な値を使って実験してみましょう。

たとえば入力された数字が `9` だったとします。これは `{3, 4, 9}` に含まれているので、期待している出力は「アタリ！」です。

質問文中にあるプログラムの for 文を見てみます。

[code]

    for(int a:numbers) {
        if(a==input) {
            System.out.println("アタリ！");
        }   
        if(a!=input) {
            System.out.println("ハズレ");
        }
    }
    
[/code]

この for では、配列 `numbers` 、つまり `{3, 4, 9}` を頭から順番に試すことで、`9` と等しいかどうか検査しようとしています。

さて、`{3, 4, 9}` の先頭は `3` なので、まず `a` に `3` が代入され、1 つ目の if 文のところで `a == input`
であるかどうか確かめられます。`3` と `9` は等しくないので、この if 文の中身は実行されません。

次に 2 つ目の if 文で `a != input` であるか確かめられます。これは真なので if
文の中身が実行され、「ハズレ」と出力されます。……あれ、期待していた動作と異なる動き方になってしまいました :-(

また、この後 for 文の最初に戻り、`a` に `4` が代入されて「ハズレ」が出力されます。最後に `a` に `9` が代入され、今回は `a ==
input` なので「アタリ！」が出力されます。

したがって全体的には実際の出力が

[code]

    ハズレ
    ハズレ
    アタリ！
    
[/code]

と 3 行に渡って出力されることになってしまいます。

### 原因

こうなってしまう原因は、配列 `numbers` の中身 **すべて** に対して「等しいかどうか」を調べるより **前**
に「ハズレ」と出力してしまうことにあります。現状のプログラムだと、各要素 1
つだけの比較のみを元にして何回も「アタリ！」「ハズレ」を出力してしまっているのです。

### 解決策 (再掲)

したがって、`numbers` に含まれるすべての要素と等しくないと分かってから初めて「ハズレ」と出力するようすれば良いのです。

たとえば for 文を回す前に「アタリだったかどうか」を示す boolean 型の変数を用意しておいて、`false` で初期化しておきます。そして for
文の中ではこの変数を弄ることしかせず、for 文が終わってから「アタリ！」「ハズレ」を true/false に基づいて 1
回だけ出力するようにすると、求める動作になります。

サンプルコードを以下に隠しておきます（マウスカーソルを上にかざすと表示されます）ので、必要に応じて参考にして下さい。

> boolean flag = false;  
>  for (int a : numbers) {  
>      if (a == input) {  
>          flag = true;  
>          break;  
>      }  
>  }  
>  if (flag) {  
>      System.out.println("アタリ!");  
>  } else {  
>      System.out.println("ハズレ");  
>  }

