java多次元配列の実行結果について解説いただけませんでしょうか
解決済
回答 4
投稿
- 評価
- クリップ 0
- VIEW 1,846
独学でjavaを学んでいますが、以下のコードの実行結果が
りんご
みかん
りんご
みかん
りんご
みかん
となる理由がわかりません。
お手数ですが解説していただけないでしょうか。
public static void main(String[] args) {
String[][] array = new String[3][2];
String[] fruit = new String[]{"りんご","みかん","さくらんぼ","ぶどう","レモン","なし","パパイヤ","すいか"};
for(String[] arr : array){
for(int i = 0;i < arr.length; i++) {
arr[i] = fruit[i];
}
}
for(int i = array.length - 1; 0 <= i; i--){
for(String arr : array[i]) {
System.out.println(arr);
}
}
}
}
上記コードを自身で解釈した際は、int i = array.length - 1
で i=1 からループが始まると解釈し、実行結果は
みかん
りんご
みかん
りんご
みかん
りんご
と出力されるのではと考えたのですが異なるようでした。
正しい読み解き方をご教授頂けないでしょうか。
よろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+5
array.lengthはこの場合3です。
arrayの中身ですが、
array[0] = {"りんご","みかん"}
array[1] = {"りんご","みかん"}
array[2] = {"りんご","みかん"}
とすべて同じになります。
次に
for(String s : array[0]) {
System.out.println(s);
}
の出力結果は
りんご
みかん
になります。
ということは
for(String s : array[2]) {
System.out.println(s);
}
for(String s : array[1]) {
System.out.println(s);
}
for(String s : array[0]) {
System.out.println(s);
}
の出力結果は
りんご
みかん
りんご
みかん
りんご
みかん
ですから、
for(int i = array.length - 1; 0 <= i; i--){
for(String s : array[i]) {
System.out.println(s);
}
}
の出力結果は
りんご
みかん
りんご
みかん
りんご
みかん
になります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
checkベストアンサー
0
for文中のi
と.length
がどのような値をとるかを理解するのが重要になってくると思います。
分かりにくいときは、図にして値を追っていくとよいと思います。
または、実際にソースを書いてみて、eclipseのdebugで処理中の値がどうなっているかを見てみるといいです。
【解説】
① String[][] array = new String[3][2];
② String[] fruit = new String[]{"りんご","みかん","さくらんぼ","ぶどう","レモン","なし","パパイヤ","すいか"};
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
arr
はこのようになります。
外側のfor文は3回ループするので、
という 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 と繰り返されるので、出力結果が
りんご
みかん
りんご
みかん
りんご
みかん
になるというわけです。
以上、ちょっとヒマなので詳しく解説してみました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
array[i]で取得される配列はどれも["りんご", "みかん"]です。これを拡張for文により順番に取り出すので、りんご、みかんの順の出力が3回なされます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
public static void main(String[] args) {
//[(1),(2)]
//[(3),(4)]
//[(5),(6)]
String[][] array = new String[3][2];
String[] fruit = new String[]{"りんご","みかん","さくらんぼ","ぶどう","レモン","なし","パパイヤ","すいか"};
for(String[] arr : array){
//1周目 [(1),(2)]
//2周目 [(3),(4)]
//3周目 [(5),(6)]
for(int i = 0;i < arr.length; i++) {
//(1)arr[0] = fruit[0] = りんご
//(2)arr[1] = fruit[1] = みかん
//(3)arr[0] = fruit[0] = りんご
//(4)arr[1] = fruit[1] = みかん
//(5)arr[0] = fruit[0] = りんご
//(6)arr[1] = fruit[1] = みかん
arr[i] = fruit[i];
}
}
for(int i = array.length - 1; 0 <= i; i--){
for(String arr : array[i]) {
//1周目 arr = array[2][0] = (5)りんご
//2周目 arr = array[2][1] = (6)みかん
//3周目 arr = array[1][0] = (3)りんご
//4周目 arr = array[1][1] = (4)みかん
//5周目 arr = array[0][0] = (1)りんご
//6周目 arr = array[0][1] = (2)みかん
System.out.println(arr);
}
}
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/05/10 13:00
てっきり「2」だと勘違いしていました・・・
解説いただき有難うございました!