プロが教えるわが家の防犯対策術!

Java勉強中なんですが、参考書を読んでいて「多次元配列は、実際には配列の配列である。つまり、2次元配列(array[][])がある場合、実際にはこれをarray[0]、array[1]、array[2]、といった1次元配列に配列として扱う事ができる。」と書いてあり、例題で、

double array[][] = new double[5][];

array[0] = new double[500];
array[0] = new double[400];
array[0] = new double[300];
array[0] = new double[200];
array[0] = new double[100];

と書いてありました。これについてのこれ以上の説明はなく、理解できなくて困っています。ご教授宜しくお願いいたします。

A 回答 (3件)

usjさん、こんんちは。


初心者の方には、「配列の配列」といわれても分かりづらいかもしれませんね。
こんな例えはどうでしょう。小学校には当然小学生がいますね。ここで「小学生」という型があります。小学生が数人~数十人で「学級」と固まり(型)となります。つまり「学級」とは「小学生」の1次元配列といえます。
次に「学級」が複数集まって「学年」という固まり(型)となります。つまり、「学年」とは「学級」の1次元配列であり、「小学生」の2次元配列と言えます。
同様に考えると「小学校」という固まり(型)は「学年」の1次元配列であり、「学級」の2次元配列であり、「小学生」の3次元配列と言えます。
この考え方でいくと「小学校」は「小学生」の3次元配列ですが、その中間の固まり「学級」、「学年」を1種の型と考えられます。
ここで、1つの「学級」が他の「学級」と「小学生」の人数は「常に同数」とは限りませんね。同様に1つの「学年」が他の「学年」と「学級」の数が一致するとは限りませんね。
Javaの配列に対する概念-「配列の配列」は、まさしくこのことです。つまり、「小学生」3次元配列「小学校」を考える場合、その中間を成す1次元配列「学級」、2次元配列「学年」も型と考えましょう。しかも、それぞれの構成要素数はバラバラになることがありますよ。といった具合です。
 では、多次元配列が「配列の配列」ではないとどうなるのでしょうか。「小学校」が「小学生」の3次元配列であることは一緒です。しかし、その中間「学級」、「学年」は、人間が考える分にはかまわないが、プログラミング言語としては分けて考えませんよ。しかも、それぞれを更生する数、(すべての「学年」の「学級」の数、すべての「学級」の「小学生」の数)は常に一致しますよ、ということです。ある「学年」は2「学級」で済むのに、他の「学年」が5「学級」必要だから、すべての「学年」で「学級」は5つ用意しないさいといっているようなもので、2「学級」ですんだ「学年」は3つ無駄にしていますね。逆に5つ用意しても、新入生が多すぎて6つ以上必要になったら、対応できませんね。これは、ちょっと不便ですね。
 ただ、1「学年」の「学級」の数、1「学級」の「小学生」の数が常に一致するのは、管理する先生方は管理はしやすいでしょうね。そうなんです。逆に、Javaの多次元配列を扱うときは、構成する要素の数が一致するとは限らないことに注意が必要なんです。
まだ勉強したてでは、まだ分からないかもしれませんが、ちょっと複雑なプログラムを構築すると出会う場面ですので、留意してください。

理解を深めてもらえましたでしょうか。
    • good
    • 0

実際に図を書いたほうが分かりやすいのではないでしょうか?



通常の1次元配列はこんな感じです。

a[0] a[1] a[2] a[3]
□  □  □  □

で、2次元配列はこんな感じです。

    a[][0] a[][1] a[][2]
a[0][] □    □   □  ← ※
a[1][] □    □   □

※の行だけを見ると、a[0]という配列の1つに対して、a[0][1]~a[0][2]という配列が存在するという形になっています。

これが2次元配列は、ary[0]…といった1次元配列の配列として扱うことができるという意味になります。

これでどうでしょうか?
    • good
    • 0

入力ミスか、本の印刷ミスかわかりませんが、こうですよね?


 array[0] = new double[500];
 array[1] = new double[400];
 array[2] = new double[300];
 array[3] = new double[200];
 array[4] = new double[100];

「2次元配列(array[][])がある場合、実際にはこれをarray[0]、array[1]、array[2]、といった1次元配列に配列として扱う事ができる。」

○日本語で説明すると・・・
普通array[0]といったら、配列ではない「ひとつの値」や「ひとつのObject」だけれど、array[0]に配列Object(配列arrとする)が保存されるときがあり、これが二次元配列です。
言い換えれば、arr[]はarrの配列であると表現するとき、array[0][]はarray[0]の配列である。すなわち、『1次元配列の配列として扱うことができる』

○式で説明すると・・・
普通の配列arrを作ります。
double arr[] = new double[5];
この普通の配列が、arr1,arr2,arr3と沢山出来てしまうので、これも配列として保存したいと考えます。イメージとしてはこんな風にしたいのです。
 //間違った宣言
 double array[] = {arr1,arr2,arr3};
これが二次元配列です。でも注意書きに書いたように、これは間違った宣言です。
そこで、Java的に正しい宣言を次のように書きます。
double[][] array = new double[5][];
 double[] arr1 = new double[10];
 double[] arr2 = new double[10];
 double[] arr3 = new double[10];
 double[] arr4 = new double[10];
 double[] arr5 = new double[10];
array[0] = arr1;//arr1はarray[0]の配列
array[1] = arr2;
array[2] = arr3;
array[3] = arr4;
array[4] = arr5;

コンナふうにダラダラ書くとわけがわからなくなるので、単純化したのが
はじめの式になります。
double[][] array = new double[5][];
 array[0] = new double[500];
 array[1] = new double[400];
 array[2] = new double[300];
 array[3] = new double[200];
 array[4] = new double[100];

あまり説明できてるような気がしませんが・・・
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!