回答編集履歴

1 追記

kaputaros

kaputaros score 1385

2016/05/10 12:17  投稿

for文中の`i`と`.length`がどのような値をとるかを理解するのが重要になってくると思います。
分かりにくいときは、図にして値を追っていくとよいと思います。
または、実際にソースを書いてみて、eclipseのdebugで処理中の値がどうなっているかを見てみるといいです。
---
【解説】
① String[][] array = new String[3][2];
![配列①](ec7b738820f1616fff97031564054cc9.png)
② String[] fruit = new String[]{"りんご","みかん","さくらんぼ","ぶどう","レモン","なし","パパイヤ","すいか"};
![配列②](25ab6ed31e5dde12c1f11b1771bfee3d.png)
>   for(String[] arr : array){
① `array`から1つずつ要素を取り出して`arr`に代入
⇒ arr の中には **配列B** があります。
また、このfor文は **配列A** を対象にしているループなので、`array.length` => **3回**ループします。
   
>  for(int i = 0;i < arr.length; i++) {
arr.length は **配列B** の要素数になるので **2** となります。
>    arr[i] = fruit[i];
   
   i の取りうる値は`0`と`1`
![内側のfor文](a6d1949e8bace4b799e15ed67ebb29f3.png)
`arr`はこのようになります。
外側のfor文は3回ループするので、
![arrayの結果](54ac2506d5520a0545d230c2c5866655.png)
という `array` が出来上がります。
次のfor文でこの出来上がった`array`を出力するのですが、
> for(int i = array.length - 1; 0 <= i; i--){
とfor文の`i`が**大きいほうから小さいほうへ**指定されるようになっていることに注意です。
ここでの`array.length`は**配列A**の要素数なので **3**、
それを -1 した値 **2** が`i`の初期値になります。
>  for(String arr : array[i]) {
ローカル変数名が上のものと同じなので勘違いしやすいのですが、
`array[i]`となっていますので**配列B**を扱っているfor文になることに注意。
**配列B**から1つずつ要素を取り出して`arr`に代入しています。
ここは**インデクスが小さい方から取り出される**ので、`System.out.println()`での出力結果は
りんご
みかん
これを**配列A**の2→1→0 と繰り返されるので、出力結果が
りんご
みかん
りんご
みかん
りんご
みかん
になるというわけです。
になるというわけです。
以上、ちょっとヒマなので詳しく解説してみました。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る