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];
と書いてありました。これについてのこれ以上の説明はなく、理解できなくて困っています。ご教授宜しくお願いいたします。
No.2ベストアンサー
- 回答日時:
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の多次元配列を扱うときは、構成する要素の数が一致するとは限らないことに注意が必要なんです。
まだ勉強したてでは、まだ分からないかもしれませんが、ちょっと複雑なプログラムを構築すると出会う場面ですので、留意してください。
理解を深めてもらえましたでしょうか。
No.3
- 回答日時:
実際に図を書いたほうが分かりやすいのではないでしょうか?
通常の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次元配列の配列として扱うことができるという意味になります。
これでどうでしょうか?
No.1
- 回答日時:
入力ミスか、本の印刷ミスかわかりませんが、こうですよね?
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];
あまり説明できてるような気がしませんが・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- JavaScript java keyを配列で表記したい 10 2022/12/01 17:53
- JavaScript 2段階プルダウンで1段階目の選択を終えた後に選択ボックスを見えなくしたい 2 2022/07/05 21:58
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- その他(プログラミング・Web制作) listへのappendが出来ない件 1 2022/12/06 21:44
- Visual Basic(VBA) 型が一致しませんとエラー 6 2023/07/06 20:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[Ljava.lang.Stringってなんですか
-
C言語でunsigned char配列を連...
-
C#で動的配列Listの中身をListB...
-
Java配列の問題を教えてくださ...
-
この警告はどうすれば?
-
main(String[] args) の args...
-
sqlparamaterでIN句を使いたい。
-
配列数を超えてアクセスしたと...
-
n番目に大きな値を探索する
-
プログラミング教えてください。
-
セッションを使ったint型の値の...
-
csvファイルを2次元配列に格納
-
ページング
-
データベースから取得したデー...
-
質問です。 配列が100以上の場...
-
javaでのプログラム(配列)につ...
-
同じ配列またはクラスを、2回...
-
インデックスソート
-
javaでデータベース(mysql)か...
-
半角カナの判別方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[Ljava.lang.Stringってなんですか
-
配列の中に複数存在する数がい...
-
【C#】ハッシュテーブル(連想...
-
配列で、値の入っている要素数...
-
JavaのBase64デコードで正しく...
-
javaで大容量テキストファイル...
-
C言語でunsigned char配列を連...
-
Java配列の問題を教えてくださ...
-
この警告はどうすれば?
-
Javaで文字を漢字であるか否か...
-
Java・配列の問題です。 int 「...
-
『args[]』とは?
-
Javaで文字と数字が混ざったも...
-
C#で動的配列Listの中身をListB...
-
javamailで複数人にメールを送...
-
ページング
-
Java 配列の問題です。 写真の...
-
【Ajax通信&Java】配列の受け取...
-
csvファイルを2次元配列に格納
-
n番目に大きな値を探索する
おすすめ情報