拡張for文 繰り返し - 配列 - 萌えJava超入門
第十章 配列

拡張for文(繰り返し)

for文のバリエーションです。
要素の値を変更しない場合はコレです。

String[] strArray = new String[10];
   ・
   ・
   ・
for(String str : strArray){
      処理;
}

目次


1.使い方

書式
for(データ型 変数 : データ型配列の変数){
  System.out.println(変数);
}
「:」(コロン)だ。
「;」(セミコロン)ではないので
注意してくれ。
これもただの区切り文字で、
深い意味はない。
なるほど。


配列のすべての値を参照する場合に、for文より簡潔に記述できる書式です。
配列のデータ型と同じデータ型の変数を用意しています。
この変数に、インデックス0から最後までの値が、次々に代入されていきます。

//Sample05_11.java
class Sample05_11 {
  public static void main(String[] args){
    String[] strArray ={
      "おはようございます",
      "こんにちは",
      "こんばんは",
      "おやすみなさい"
    };
    for(String str : strArray){
      System.out.println(str);
    }
  }
}

コマンドライン
> javac Sample05_11.java
> java Sample05_11
おはようございます
こんにちは
こんばんは
おやすみなさい

配列の途中から参照することはできない。
最初から最後までだ。
縛りが多い構文すね。


2.拡張for文の特徴

重要
  1. 配列の途中から参照することはできません。
  2. インデックスがありません。(int i=0 のこと)
  3. 配列の要素の値を変更できません。



3.配列の要素の値を変更できません


配列の要素の値を、一度変数「str」に代入している点に注意してください。
変数「str」の値を変更しても、配列の要素の値が変わるわけではありません。
配列の要素の値を変更したい場合には、通常のfor文でインデックスを指定しましょう。

例外:
  要素がクラス型の場合、インスタンス内の値は変更できます。
  Sample05_661は、まだ説明していない内容を含みます。
   → Sample05_661.java

//Sample05_13.java
class Sample05_13 {
  public static void main(String[] args){
    String[] strArray ={
      "おはようございます",
      "こんにちは",
      "こんばんは",
      "おやすみなさい"
    };

    System.out.println("\n--変数の値を変更して表示--");

    for(String str : strArray){//要素を変数に代入しています
      str+="でゲス";
      System.out.println(str);
    }

    System.out.println("\n--配列の値--");

    for(int i=0; i<strArray.length; i++){
      System.out.println(strArray[i]);
    }
  }
}

コマンドライン
> javac Sample05_13.java
> java Sample05_13

--変数の値を変更して表示--
おはようございますでゲス
こんにちはでゲス
こんばんはでゲス
おやすみなさいでゲス

--配列の値--
おはようございます
こんにちは
こんばんは
おやすみなさい

「でゲス」を足したのは
あくまでも変数str であって、
strArrayの要素ではないってことですね。


4.拡張for文の有効な使い方


ちなみに、
どういうときに使えるんスか?
配列の値を使いたいけれど、配列の値を変えたくないときに使えます。
拡張for文を使っている時点で
 1. 配列に変更を加えない
 2. 最初から最後まで処理している。
の2点が担保できるから可読性が高くなります。

例えば、配列の合計や平均を求める場合が考えられます。
「変更しないよ」ってゆう
アピール的な感じ。
あ~。
なるほど。
逆転の発想ね。


//Sample05_17.java
class Sample05_17 {
  /*合計 最大 最小 平均 を求めます*/
  public static void main(String[] args){

    int[] array = {
        80,74,91,70,44,68,92,76,88,57
    };
    double sum = 0;
    double max = 0;
    double min = 100;//最高得点 100点
    double avg = 0;

    for(int num : array){
        sum += num;
        max = max < num ? num : max;//大きい方を代入
        min = min > num ? num : min;//小さい方を代入
    }
    avg = sum / array.length;

    System.out.println("合計: " + sum);
    System.out.println("最大: " + max);
    System.out.println("最小: " + min);
    System.out.println("平均: " + avg);
    }
}

コマンドライン
>javac Sample05_17.java
>java Sample05_17
合計: 740.0
最大: 92.0
最小: 44.0
平均: 74.0

少しレベルを上げたサンプルコードです。
配列arrayの、合計・最大・最小・平均 を計算するプログラムです。

  1. 配列arrayには、10個の値が代入されています。
  2. 拡張for文で、arrayの値を順番に 変数num へ読んでいます。
  3. sumは、すべての値を次々と足して計算しています。
  4. max と min は、三項演算子で、「より大きなもの」「より小さなもの」を代入しています。
  5. avg は、sum/要素数で求められています。


できる人には、一目で「array」に変化が起こらないことがわかる。
って、え?!
合計とか、こうやって求めるの?
これが普通ですが、なにか?


配列の章はこれで終了です。お疲れ様でした。




© 2019 awasekagami