- ベストアンサー
多次元配列は配列の配列である
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]; と書いてありました。これについてのこれ以上の説明はなく、理解できなくて困っています。ご教授宜しくお願いいたします。
- Java
- 回答数3
- ありがとう数1
- みんなの回答 (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の多次元配列を扱うときは、構成する要素の数が一致するとは限らないことに注意が必要なんです。 まだ勉強したてでは、まだ分からないかもしれませんが、ちょっと複雑なプログラムを構築すると出会う場面ですので、留意してください。 理解を深めてもらえましたでしょうか。
その他の回答 (2)
実際に図を書いたほうが分かりやすいのではないでしょうか? 通常の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次元配列の配列として扱うことができるという意味になります。 これでどうでしょうか?
- kuro_73
- ベストアンサー率28% (33/117)
入力ミスか、本の印刷ミスかわかりませんが、こうですよね? 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
- 二次元配列
質問失礼します。 二次元配列の練習中で、 nijigen = new Array(); nijigen[0] = new Array(0,0,0,0); nijigen[1] = new Array(0,0,0,0); nijigen[2] = new Array(0,0,0,0); nijigen[3] = new Array(0,0,0,0); という配列を作りました。 そして、その配列と同じ配置にされたボタンを押すと、その位置の配列の数値に「1」が代入されるというものです。 そこでですが、「配列の内容が全て1になった時」を検知出来るようにしたいのですが、どのようにすればよいのでしょうか。 よろしくお願いします。 //↓こうなった時に検知したいのです nijigen = new Array(); nijigen[0] = new Array(1,1,1,1); nijigen[1] = new Array(1,1,1,1); nijigen[2] = new Array(1,1,1,1); nijigen[3] = new Array(1,1,1,1);
- ベストアンサー
- Flash
- 2次元配列を多次元配列にする。
2次元配列を多次元配列にする。 PHP5で 2次元目はすべて同じキーの2次元配列を 2次元目のキーごとの内容を共通項にまとめて、 多次元配列にする方法を教えてください。 キーの数は膨大なので、関数の再帰呼び出し で、きれいに処理したいのです。 説明文では説明しきれないので、 やりたいことは↓の通りです。 array[0] = array([one] => "あ", [twe] => "う" [three] => "き"); array[1] = array([one] => "あ", [twe] => "う" [three] => "く"); array[2] = array([one] => "あ", [twe] => "え" [three] => "け"); array[3] = array([one] => "あ", [twe] => "え" [three] => "こ"); array[4] = array([one] => "い", [twe] => "お" [three] => "さ"); array[5] = array([one] => "い", [twe] => "お" [three] => "し"); array[6] = array([one] => "い", [twe] => "か" [three] => "す"); array[7] = array([one] => "い", [twe] => "か" [three] => "せ"); という配列があったら、これを↓のようにしたいです。 array( [あ] => array( [う] => array ("き", "く") [え] => array ("け", "こ") ) [い] => array( [お] => array ("さ", "し") [か] => array ("す", "せ") ) ) どうぞよろしくお願いいたします。
- ベストアンサー
- PHP
- jspでの二次元配列
こんにちは。初めて質問させていただきます。よろしくお願いします。 現在javaで作ったプログラムをjspでも使えるようにしようと考えているのですが、 二次元配列がうまくjspで反映されず困っています。 jspに関してはほとんど無知で一から勉強している次第です。 そのためなるべく簡単に、と思い 以下のプログラムを、<% %>の間に入れるだけで動かせないかと思ったのですが エラーが出てしまいました。一次元の配列ならばできたのですが... ちなみに以下のプログラムはcsvファイルを読み込み、 多次元配列に格納していくというものです。 稚拙なプログラムで申し訳ありません... どなたかご教授いただければ幸いです。 import java.io.*; import java.util.StringTokenizer; import java.util.ArrayList; class Dog{ public static void main(String args[]) throws IOException{ String csv = "dognum.csv"; BufferedReader br = new BufferedReader(new FileReader(csv)); String[][] array = new String[100][]; int i = 0; while (true) { String line = br.readLine(); if(line==null) break; array[i] = line.split(","); i++; } for (i = 0; i < 101; i++) { for (int j = 0; j < array[i].length; j++) { System.out.println("["+i+"]["+j+"] = " + array[i][j]); } } } }
- 締切済み
- Java
- 多次元配列の動的メモリ
1次の配列aの動的メモリは例えば 「double *a; int num = 3; //配列の数 a = new double [3];」 などとすれば確保できることは分かるのですが、 二次元配列など、多次元配列の動的メモリは どのようにすれば確保できるのですか?
- 締切済み
- C・C++・C#
- 多次元配列を2次元の連想配列で表したい
PHP初心者です。 $category = array( array( 'ライフ' ), array( 'デジタルライフ', array( '携帯・PHS' ), array( 'ワンセグ放送' ) ), array( '趣味', array( 'AV機器', array( 'オーディオ' ), ), ), ); このような多次元配列を $new_category = array( array( 'id'=> '1', 'parent_id' => '-', 'name' => 'ライフ', ), array( 'id'=> '2', 'parent_id' =>'-', 'name' => 'デジタルライフ', ), array( 'id'=> '3', 'parent_id' => '2', 'name' => '携帯・PHS', ), array( 'id'=> 4, 'parent_id' => '2', 'name' => 'ワンセグ放送', ), array( 'id'=> 5, 'parent_id' => '-', 'name' => '趣味', ), array( 'id'=> '6', 'parent_id' => '5', 'name' => 'AV機器', ), ); このような二次元配列に変換したいです。 parent_idを入れておく配列を作って、階層が深くなったら前の要素のIDを配列に入れ、浅くなったら配列の末尾の要素を消去する…みたいなことを考えてあれこれやってみたのですが、なかなかうまくいきません。 何か良い方法がありましたら、教えていただけるとありたがいです。 よろしくお願い致します。
- ベストアンサー
- PHP
- 多次元配列を、1次元の配列にする関数を書いてください。
以下のように、多次元配列の配列をペチャンコにする関数(array_flatten)ってどうかきますか? <?php $arr[0] = 'a'; $arr[1][0] = 'b'; $arr[1][1][0] = 'c'; $arr[1][1][1][0] = 'd'; $arr[1][1][1][1][0] = 'e'; $arr[1][1][1][2] = 'f'; $arr[1][1][2] = 'g'; $arr[1][2] = 'h'; $arr[2] = 'i'; function array_flatten($arg){ 処理; } $new_arr = array_flatten($arr); print_r($new_arr); ?> ↓ Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f [6] => g [7] => h [8] => i ) ※関数のなかで、ペチャンコの配列を格納するための新しい配列を宣言すると、 同関数を再帰的に呼び出したら、その配列が初期化されますよね?
- ベストアンサー
- PHP
- 二次元配列について
こんにちは。いつもお世話になっております。 JavaScriptで二次元配列(配列の入れ子)を作ろうとしています。 ソースは下記のとおりです。 var menu = new Array("朝食","昼食","夕食"); menu[0] = new Array(); menu[0][0] = "コーヒー"; menu[0][1] = "牛乳"; menu[1] = new Array(); menu[1][0] = "サラダ"; menu[1][1] = "サンドイッチ"; menu[2] = new Array(); menu[2][0] = "天ぷら"; menu[2][1] = "刺身"; document.write(menu[0],"は",menu[1][0] + "<br>" ); 最後のwriteメソッドを使用して 「昼食はサラダ」と表示したいのですが「コーヒー,牛乳はサラダ」 になってしまいます。 どう記述すればいいでしょうか?ネットでいろいろ検索してみましたが 分かりませんでした。 よろしくお願い申し上げます。
- ベストアンサー
- JavaScript
- 2次元配列の動的確保について、アドバイス下さい
今、大容量の2次元配列を造りたいので、 メモリの動的確保の勉強をしてました。 昔は、サイズ分mallocで確保して、配列の各行の先頭アドレスを それぞれ対応させていって、行列としてポインタを扱えるようにしてたのですが、 調べていると、もっと簡単に2次元配列のメモリを確保できるみたいなので、その方法を調べていました。 その中で、 if(!(ptr = (int (*)[RETSU])calloc(GYOU*RETSU, sizeof(int)))) こういう例題を見つけたんですけど、 これの、(*)[RETSU])のところが、理解できません。 これは何をしているのでしょうか? どういう言葉で検索すれば、説明が出てくるのか解らなかったので質問させて頂きました。 この(*)[RETSU]の感じの書き方をすると、結構簡単にメモリ確保できるみたいなので、解説、または説明サイトなど教えて頂けると助かります。 または、例題を書いていただけるとスゴク助かります。 ちなみに私が造りたいのは、 100行300000列 ほどの配列です。 是非、よろしくお願いします。
- 締切済み
- C・C++・C#
- ArrayListに多次元配列
ArrayListに多次元配列の変数を格納したのですが、取り出し方がわからず困っています。 ----------------------------------------------- String[][] str = {{"aaa","bbb","ccc","ddd","eee","fff"}, {"aaa","bbb","ccc","ddd","eee","fff"}, }}; ArrayList array = new ArrayList(); array.add(str[0]); array.add(str[1]); ----------------------------------------------- 上記の場合で、str[0][2];を取得する方法がわかりません。 java初心者なのでおかしな質問かもしれませんが、宜しくお願いします。
- ベストアンサー
- Java
- JavaScriptで2次元配列を扱う方法
C言語を少しだけやっていました。 JavaScriptで2次元配列作りたいのですが、上手くいきません。 var array[5][5]; array[0][0] = 21; document.write(array[0][0]); ↑を実行しても「21」と表示されません。 new array()とか色々試しましたが上手くいかないので質問させていただきました。 教えてください!
- ベストアンサー
- JavaScript