javaプログラミングの入門書を読んでおり、そのなかの

多次元配列のコードの中で良く分からない点があったので
質問させていただきます。

コードは以下の通りです。

class Number {
public static void main (String[]args) {
int[][] a={
{10,20},
{30,40},
{50,60}
};
System.out.println("a[0][0]="+a[0][0]
+"a[0][1]="+a[0][1]);

System.out.println("a[1][0]="+a[1][0]
+"a[1][1]="+a[1][1]);
System.out.println("a[2][0]="+a[2][0]
+"a[2][1]="+a[2][1]);
}
}

さて、このコードの
実行結果が
a[0][0]=10 a[0][1]=20
a[1][0]=30 a[1][1]=40
a[2][0]=50 a[2][1]=60
と表示されますが、
なぜ、例えば、a[0][0]が10になるのかわかりません。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2010/12/12 01:32:53
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:dokonodareo No.3

回答回数22ベストアンサー獲得回数1

ポイント28pt

方向云々ではなく、配列の入れ子と考えれば宜しいように思います。

a は、{ {10, 20}, {30, 40}, {50, 60} } と書き表すことができる。つまり、配列 a は3個の要素を持つ配列であるが、その各要素もまた2個の要素を持つ配列である。つまり a は配列が入れ子状になったものである。

  • a の第0要素 a[0] は {10, 20} ... 入れ子レベルの第0層

  • a[0] の第0要素 a[0][0]は 10 ... 入れ子レベルの第1層

  • a[0] の第1要素 a[0][1]は 20 ... 入れ子レベルの第1層

というところです。

なお、

int a[][] = new int[3][3];

は誤記であろうかと思います。

int a[][] = new int[3][2];

であろうと思います。

id:ripodbnf

回答ありがとうございました。入れ子という説明が分かりやすかったです。

int a[][] = new int[3][2]; についてですが、

順序が[2][3]ではなく、[3][2]なのは入れ子レベルが大きい順に記述するということでしょうか?

2010/12/09 12:26:30

その他の回答3件)

id:deflation No.1

回答回数1036ベストアンサー獲得回数126

ポイント23pt

以下の部分で初期値を代入しているからです。

int[][] a={
{10,20},
{30,40},
{50,60}
};

この代入式を分解すると、下記と同じになります。

int a[][] = new int[3][3];
a[0][0] = 10;
a[0][1] = 20;
a[1][0] = 30;
a[1][1] = 40;
a[2][0] = 50;
a[2][1] = 60;
id:ripodbnf

回答ありがとうございます。

ところで

int a[][] = new int[3][3];

のなかの[3][3]という部分はy方向とx方向の要素数を表すと本にありました。

この場合、データが6つなので(10,20,30,40,50,60)

どうしてint a[][] = new int[2][3];

でないのかと思ったのですが、どうしてなのでしょうか。

2010/12/09 07:58:58
id:bnn No.2

回答回数120ベストアンサー獲得回数39

ポイント23pt

この場合厳密には new int[3][2]です。

恐らく[3][3]にした理由は特にないと思います。(間違ってたらすみません)

それよりわかりやすく分解してあるので少し追加。


int[][] a = new int[3][2]

Java内ではこんな感じに作られます。

a

[0] → [ ][ ]

[1] → [ ][ ]

[2] → [ ][ ]


{10,20}

{30,40}

{50,60} と並ぶのはそのためです。

id:ripodbnf

回答ありがとうございました!

2010/12/09 12:26:43
id:dokonodareo No.3

回答回数22ベストアンサー獲得回数1ここでベストアンサー

ポイント28pt

方向云々ではなく、配列の入れ子と考えれば宜しいように思います。

a は、{ {10, 20}, {30, 40}, {50, 60} } と書き表すことができる。つまり、配列 a は3個の要素を持つ配列であるが、その各要素もまた2個の要素を持つ配列である。つまり a は配列が入れ子状になったものである。

  • a の第0要素 a[0] は {10, 20} ... 入れ子レベルの第0層

  • a[0] の第0要素 a[0][0]は 10 ... 入れ子レベルの第1層

  • a[0] の第1要素 a[0][1]は 20 ... 入れ子レベルの第1層

というところです。

なお、

int a[][] = new int[3][3];

は誤記であろうかと思います。

int a[][] = new int[3][2];

であろうと思います。

id:ripodbnf

回答ありがとうございました。入れ子という説明が分かりやすかったです。

int a[][] = new int[3][2]; についてですが、

順序が[2][3]ではなく、[3][2]なのは入れ子レベルが大きい順に記述するということでしょうか?

2010/12/09 12:26:30
id:tama213 No.4

回答回数486ベストアンサー獲得回数30

ポイント22pt

>[3][2]なのは入れ子レベルが大きい順に記述するということでしょうか?

あなたの感覚では、そうです。

単に前から順に書いてるだけですけど。

id:ripodbnf

回答ありがとうございました

2010/12/12 01:31:06
  • id:dokonodareo
    #3 の回答者です。“1人当たり1回まで回答出来ます”の縛りのために入力できず、返答が遅れました。

    >順序が[2][3]ではなく、[3][2]なのは入れ子レベルが大きい順に記述するということでしょうか?

    “入れ子”のアナロジーからすれば、(器の)大きい順にならんでおります。そのアナロジーで言えば、(器の)大きい順です。
    ではありますが、#3の説明の言葉で続けるならば、数字としては、レベル0、レベル1... と『昇順に』並んでおりますので、レベル番号としては小さい順に並ぶと言うべきかと思います。

    たとえば、3次元配列相当の { { { 0, 1, 2, 3 }, { 4, 5, 6, 7 } }, { { 8, 9, 10, 11 }, { 12, 13, 14, 15 } }, { { 16, 17, 18, 19 }, { 20, 21, 22, 23 } } } を例に取れば

    第0レベル ... 要素の数は3つ
    第1レベル ... 第0レベルでのそれぞれの要素についての要素の数は2つ
    第2レベル ... 第1レベルでのそれぞれの要素についての要素の数は4つ

    ですから、この場合であれば、

    int a [][][] = new int[3][2][4] ;

    となります。
    第0レベル、第1レベル、第2レベル...の各々のレベルでの要素の個数を、その順に定義するとご理解ください。
  • id:ripodbnf
    dokonodareoさんかさねがさね丁寧なご回答ありがとうございました!
    回答制限すみませんでした。直しておきました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません