配列の最初から最後まで順に見ていくときのスマートなfor文があります。文法的には難しくないのでどんどん使ってみてください。ちょっとかっこいいかも。
タラララララララ
息子が保育園のとき、発表会の合奏で「木琴をやる」というので、ドレミもわからないのにどんな演奏をするのかな?と心配していました。さていよいよ本番、木琴の前にバチを一本だけ持って、真剣な顔つきで立っています。こういうときは親もドキドキです。すると...なんとタラララララララとバチで木琴をなぜ上げたのです。そして高々とバチを振り上げフィニッシュ。おもわず笑ってしまいました。ドレミも何も関係ありません。いや今思い出してもニヤニヤしてしまいます。
話は長くなりましたが、配列についても、先頭の要素から最後の要素まで、タラララララと順に見ていく場合、便利な書き方があります。次は各要素の値を順に出力しています。
int[] a = { 3, 2, 5, 7 }; for (int element : a) { System.out.println(element); }
変数elementには、繰り返しのたび配列aの要素の値が順に入ってきます。このelementの値を出力してやれば、3から7まで順に出てきます。
気をつけてほしいのは、タララララララ以外はできないということです。例えば要素を一つおきに出力する、最後から最初に向かって出力する、途中から出力する、などはできません。例えば出力以外にも、全要素の合計を求める、など要素を参照することはOKですが、要素に代入することはできません。このようなときは添字を使った従来のfor文で書いてください。
ただ意外と配列についてはタララララララの処理が必要になってくるので、この新しい書き方も覚えておきましょう。ちょっとスマートに書けます。
上のfor文はこう書き換えても同じです。
for (int i = 0; i < a.length; i++) { int element = a[i]; System.out.println(element); }
ダイエット成功?
ついでに前章でやった最大値を求める処理も書き換えてみます。
int max = -1; for (int element : a) { if (element > max) { max = element; } } System.out.println(max);
なにしろ途中からは入れないので、ちょっと工夫します。データは人数なので、配列aにマイナスの値は入っていないでしょう。そこで変数maxに-1(マイナスの値なら何でもよいのですが)を入れておいて、繰り返しの中で必ずmaxの値が更新されるようにしておきます。
もしデータにマイナスも含まれるという場合、この方法は通用しませんので、次のやり方はどうでしょう?
int max = a[0]; for (int element : a) { if (element > max) { max = element; } } System.out.println(max);
一回目の繰り返しは無駄ですが、しょうがないですね。間違った答えは出ません。まあスマートになろうとして無理するよりも、従来の添え字を使ったfor文で記述しておいてもいいかもしれません。
クラス型の配列についても同様です。前章の配列xのデータを順に出力してみましょう。
Person[] x; x = new Person[3]; x[0] = new Person(); x[0].name = "太郎"; x[0].age = 5; x[1] = new Person(); x[1].name = "次郎"; x[1].age = 100; x[2] = new Person(); x[2].name = "三郎"; x[2].age = 55; for (Person person : x) { System.out.println(person.name + " " + person.age); }
気をつけてもらいたいのは、変数personの型です。先ほどのaはint型の配列なので、要素の型はintでしたが、今度は要素の型はPersonです。変数personの型はPersonになり、繰り返しの中では、変数personで要素を表します。よって名前はperson.name、年齢はperson.ageで参照できます。