質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

2474閲覧

java多次元配列の実行結果について解説いただけませんでしょうか

BSS_sapporo

総合スコア44

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

0クリップ

投稿2016/05/09 07:46

独学でjavaを学んでいますが、以下のコードの実行結果が

りんご
みかん
りんご
みかん
りんご
みかん

となる理由がわかりません。
お手数ですが解説していただけないでしょうか。

public

1 2 public static void main(String[] args) { 3 String[][] array = new String[3][2]; 4 String[] fruit = new String[]{"りんご","みかん","さくらんぼ","ぶどう","レモン","なし","パパイヤ","すいか"}; 5 6 for(String[] arr : array){ 7 for(int i = 0;i < arr.length; i++) { 8 arr[i] = fruit[i]; 9 } 10 } 11 for(int i = array.length - 1; 0 <= i; i--){ 12 for(String arr : array[i]) { 13 System.out.println(arr); 14 } 151617} 18

上記コードを自身で解釈した際は、int i = array.length - 1で i=1 からループが始まると解釈し、実行結果は

みかん
りんご
みかん
りんご
みかん
りんご

と出力されるのではと考えたのですが異なるようでした。
正しい読み解き方をご教授頂けないでしょうか。
よろしくお願いいたします。

yodel👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

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); } }

の出力結果は

りんご みかん りんご みかん りんご みかん

になります。

投稿2016/05/09 08:02

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BSS_sapporo

2016/05/10 04:00

array.lengthは「3」なのですね! てっきり「2」だと勘違いしていました・・・ 解説いただき有難うございました!
guest

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`

内側のfor文
arrはこのようになります。
外側のfor文は3回ループするので、
arrayの結果
という array が出来上がります。

次のfor文でこの出来上がったarrayを出力するのですが、

for(int i = array.length - 1; 0 <= i; i--){

とfor文のi大きいほうから小さいほうへ指定されるようになっていることに注意です。
ここでのarray.length配列Aの要素数なので 3
それを -1 した値 2iの初期値になります。

for(String arr : array[i]) {

ローカル変数名が上のものと同じなので勘違いしやすいのですが、
array[i]となっていますので配列Bを扱っているfor文になることに注意。

配列Bから1つずつ要素を取り出してarrに代入しています。
ここはインデクスが小さい方から取り出されるので、System.out.println()での出力結果は

りんご
みかん

これを配列Aの2→1→0 と繰り返されるので、出力結果が

りんご
みかん
りんご
みかん
りんご
みかん

になるというわけです。
以上、ちょっとヒマなので詳しく解説してみました。

投稿2016/05/10 03:16

編集2016/05/10 03:17
kaputaros

総合スコア1844

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BSS_sapporo

2016/05/10 05:36

ものすごくストンと理解できました! 図解までつけていただいて本当にありがとうございます!!
guest

0

Java

1public static void main(String[] args) { 2 //[(1),(2)] 3 //[(3),(4)] 4 //[(5),(6)] 5 String[][] array = new String[3][2]; 6 String[] fruit = new String[]{"りんご","みかん","さくらんぼ","ぶどう","レモン","なし","パパイヤ","すいか"}; 7 8 for(String[] arr : array){ 9 //1周目 [(1),(2)] 10 //2周目 [(3),(4)] 11 //3周目 [(5),(6)] 12 for(int i = 0;i < arr.length; i++) { 13 //(1)arr[0] = fruit[0] = りんご 14 //(2)arr[1] = fruit[1] = みかん 15 //(3)arr[0] = fruit[0] = りんご 16 //(4)arr[1] = fruit[1] = みかん 17 //(5)arr[0] = fruit[0] = りんご 18 //(6)arr[1] = fruit[1] = みかん 19 arr[i] = fruit[i]; 20 } 21 } 22 for(int i = array.length - 1; 0 <= i; i--){ 23 for(String arr : array[i]) { 24 //1周目 arr = array[2][0] = (5)りんご 25 //2周目 arr = array[2][1] = (6)みかん 26 //3周目 arr = array[1][0] = (3)りんご 27 //4周目 arr = array[1][1] = (4)みかん 28 //5周目 arr = array[0][0] = (1)りんご 29 //6周目 arr = array[0][1] = (2)みかん 30 System.out.println(arr); 31 } 323334}

投稿2016/05/09 14:03

kentei_syunrai

総合スコア946

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BSS_sapporo

2016/05/10 05:33

細かいところまでコメントいただきありがとうございます! そういう動きになるのですね。大変助かりました!
guest

0

array[i]で取得される配列はどれも["りんご", "みかん"]です。これを拡張for文により順番に取り出すので、りんご、みかんの順の出力が3回なされます。

投稿2016/05/09 08:02

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BSS_sapporo

2016/05/10 05:29

取得される配列が["りんご", "みかん"]であるという理解ができていませんでした・・・。 ご説明頂きありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問