• ベストアンサー

二次元配列

質問失礼します。 二次元配列の練習中で、 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);

noname#77303
noname#77303
  • Flash
  • 回答数6
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.6

#3です。 > 二次元配列にしてる理由は、「ライツアウト」を作っていて、 そのような知的なゲームを作ろうとされていたのですね。 > できれば、タイムライン上にまとめて書きたいのです。 説明するより作った方が早いですね。 しかし,半分答えみたいなことを書いてしまっても良いのですか? まさか本当に課題ではないでしょうね...?? また,考えることが楽しみなのであり勉強になるのでは??? と思いますが。 本当に, タイムライン上 の フレーム1 だけにまとめて書いた ActionScript だけで, ムービークリップなど全てを作成してしまうというものを作ってはみました。 全て AS なので,ステージ上には基本的に全く何も用意しなくて良いです。 (無駄はたくさんあると思いますが。) //////////////////////////////////////////////////////////////////// // ◎ ライツアウト(もどき?) //  ルール: 配列要素が全てが 1 で 表示が全て ● になればゲームクリア //  ActionScript 1.0 Flash Player 6(Flash MX) 以上で使用可能 //  Flash を起動させて フレーム1 にコピペ→パブリッシュするだけでOK //////////////////////////////////////////////////////////////////// // // 縦の行数(row数)を設定 (★2~10で変更可) tate = 10; // 横の列数(column数)を設定 (★2~10で変更可) yoko = 10; // マークの配列 markArr の設定 (★好きな文字に変更可) markArr = new Array("○", "●"); // // 光の配列 lightArr の初期化 /*  1,1,1,… yoko数  1,1,1,… yoko数  1,1,1,… yoko数   …  tate数  の配列を自動作成↓ */ lightArr = new Array(); for (i=0; i<=tate-1; i++) { lightArr[i] = new Array(); for (j=0; j<=yoko-1; j++) { lightArr[i][j] = 1; } } // 照合用文字列(ゴール状態)の作成 goal = "1"; for (i=0; i<=tate*yoko-2; i++) { goal += ",1"; } // // 光の配列 と マークを変更する関数 changeLight を定義 function changeLight(row, col) { // クリックされたMC自体 if (lightArr[row][col] == 0) { lightArr[row][col] = 1; _root["lightMC"+row+col]._txt.text = markArr[lightArr[row][col]]; } else { lightArr[row][col] = 0; _root["lightMC"+row+col]._txt.text = markArr[lightArr[row][col]]; } // クリックされたMCの上下のMC for (i=-1; i<=1; i += 2) { if (lightArr[row+i][col] == 0) { lightArr[row+i][col] = 1; _root["lightMC"+(row+i)+col]._txt.text = markArr[lightArr[row+i][col]]; } else if (lightArr[row+i][col] != undefined) { lightArr[row+i][col] = 0; _root["lightMC"+(row+i)+col]._txt.text = markArr[lightArr[row+i][col]]; } } // クリックされたMCの左右のMC for (i=-1; i<=1; i += 2) { if (lightArr[row][col+i] == 0) { lightArr[row][col+i] = 1; _root["lightMC"+row+(col+i)]._txt.text = markArr[lightArr[row][col+i]]; } else if (lightArr[row][col+i] != undefined) { lightArr[row][col+i] = 0; _root["lightMC"+row+(col+i)]._txt.text = markArr[lightArr[row][col+i]]; } } } // // 明滅ムービークリップ lightMC** の作成(本来は手動で作成) for (i=0; i<=tate-1; i++) { for (j=0; j<=yoko-1; j++) { _root.createEmptyMovieClip("lightMC"+i+j, i*10+j); my_mc = _root["lightMC"+i+j]; my_mc._y = i*20+10; my_mc._x = j*20+10; my_mc.createTextField("_txt", 0, 0, 0, 20, 20); my_mc._txt.border = true; my_mc._txt.background = true; my_mc._txt.text = markArr[lightArr[i][j]]; my_mc.i = i; my_mc.j = j; my_mc.onRelease = function() { // 上で定義した関数 changeLight を実行 changeLight(this.i, this.j); // 下で定義する関数 judgeLight を実行 judgeLight(); }; } } // // 問題(初期状態)の作成 for (m=0; m<=tate-1; m++) { for (n=0; n<=yoko-1; n++) { if (Math.floor(Math.random()*2)) { // 上で定義した関数 changeLight を実行 changeLight(m, n); // ★解答の用意(私が解けないので検証用に勝手に用意しました) //   水色の部分を全て1回ずつクリックするとクリアできます //   本番では消してください↓ (他で利用できるかも) _root["lightMC"+m+n]._txt.backgroundColor = 0xCCFFFF; } } } // // 全て goal 状態になったかを判定する関数 judgeLight の定義 function judgeLight() { if (lightArr.toString() == goal) { _root.createTextField("goal_txt", 100, 10, tate*20+10, 80, 20); _root.goal_txt.text = "おめでとう!"; for (i=0; i<=tate-1; i++) { for (j=0; j<=yoko-1; j++) { _root["lightMC"+i+j]._txt.backgroundColor = 0xFF0000; delete _root["lightMC"+i+j].onRelease; } } } } //////////////////////////////////////////////////////////////////// // 問題(初期状態)の作成 の部分に関してですが。 とりあえず配列の要素は全て 1 にしておいて, 5×5=25個のムービークリップを総当たりでアクセスし, 適当に 1 か 0 かの乱数を発生させて, 1 であればそのムービークリップをプログラムで1回クリックするという方式をとっています。 したがって,決して 「クリア不可能問題」 は作成されないはずです。 しかし, 本当に適当に 1 か 0 かの乱数を発生させているだけなので, 例えば 5×5の場合,2の25乗=33554432 回に1回くらいは, 「最初から全て 1 (最初からゲームクリア)な問題」 が作成される可能性があります。 また,問題作成には色々な考え方も出てくると思いますから,この辺をどうするのかは考えてみてください。 上のプログラムコード自体は数十分ほどでできたのですが, 悲しいことに,ゲームが難しくて検証ができない(何時間やってもゲームがクリアできない)ので,  // ★解答の用意(私が解けないので検証用に勝手に用意しました)  //   水色の部分を全て1回ずつクリックするとクリアできます  //   本番では消してください↓ (他で利用できるかも)  _root["lightMC"+i+j]._txt.backgroundColor = 0xCCFFFF; という解答カンニング部分を勝手に付け加えました。 困ったことに,私はカンニングしないとぜんぜん解けません。 ライツアウトというゲーム初体験ですが難しいですね...。 ゲームのプログラムを作成するより,ゲームを攻略する方がはるかに難しいですよ (ノ_・、) 。 MC もしくは ボタン というインスタンスは作成すると思うので, 配列を用意する必要もとくにないと言えばないのですが, 他で配列の演算を使うのかもしれないと思い,配列と連動した動きのものにしてみました。 1行1行なにをしているのかというコメント行は入れていません。 スクリプト(語)が不明な場合は,調べてみてください。 ※ PS #4の方。 なるほど! 参考になりました。

noname#77303
質問者

お礼

詳しい回答ありがとうございます。 なるほど、文面だけでは複雑に見えるので「う~ん」と唸ってしまったのですが、実際に動作させると意味が分かってきました。 >例えば 5×5の場合,2の25乗=33554432 回に1回くらいは, 「最初から全て 1 (最初からゲームクリア)な問題」 が作成される可能性があります。 コレに関しては、大して気にする事でもないので放置するつもりですが、公開後に苦情があったら対処したいと思います。 大変参考になりました。課題ではないので教えていただいて助かりました。 ありがとうございました。

その他の回答 (5)

  • taku2888
  • ベストアンサー率60% (15/25)
回答No.5

アルゴリズムは、いろんな方法が出てくるので楽しくて良いですね。 is_mayさんは、具体的に表現頂きわかりやすいです。 でも下記「◆◆」が無いと途中で0があっても最後までloopする可能性が残っているのでは。 全然たいしたことではないのに申し訳ありません。 kenshutu=true; for(var i=0;i<4;i++){  for(var t=0;t<4;t++){   if(!nijigen[i][t]){ //一つでも「0」があれば、    kenshutu=false; //「kenshutu」変数を負にして、    break; //forを抜ける。   }  }  if (kenshutu) break; //←◆◆これが無いと1発目が0の時とか抜けられません。 } ボタン一つづつに条件が入れられるのであれば「suzuki-_-さん」に1票です。 でも、わざわざ2次元配列にしてるのですから何らかの別処理があるのでしょうか。 そうすると別変数を持つのは面倒かもですね。 いっそのこと、配列をやめてビット処理にすれば ffffなら4×4の配列にも見立てできるし、どこのボタンかも判断できる。 そして0xffffなら、全て1でloopもいらないし。 好き勝手言って済みません。 プログラムは十人十色、がんばってください。

noname#77303
質問者

お礼

二次元配列にしてる理由は、「ライツアウト」を作っていて、どこが点灯しているか、どこが消灯しているかを分かりやすく把握するためです。あと、プログラミング自体に関しても初心者なので、知識不足です。 できれば、タイムライン上にまとめて書きたいのです。 ライツアウトとは http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%84%E3%82%A2%E3%82%A6%E3%83%88 回答ありがとうございました。

  • suzuki-_-
  • ベストアンサー率77% (152/195)
回答No.4

#3の方が挙げられているjoin()の配列連結による区切りの問題点について、 全て1だった際に、nijigen.join() は 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 となり、一見どこで二次元配列が区切られていたのかわからないですが、 これは基本的に配列を ,(カンマ)区切りでString化されるので起こってしまうもので、 下記の形で見るとわかりやすいと思いますが、 (1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1) 今回の nijigen.join() で連結させたのは括弧で挟まれていないカンマの部分です join()は引数でセパレータを記述することにより、 連結時の区切りを指定することができます なので、区切りをカンマ以外にすることで、#3の方が仰っている、 配列の長さ等による区別の付かない問題点を解決することができます 例: Ar1 = [[0, 1, 2], [3, 4, 5]]; Ar2 = [[0, 1], [2, 3, 4, 5]]; trace(Ar1.join() + " == " + Ar2.join() + " / " + (Ar1.join() == Ar2.join())); trace(Ar1.join("+") + " == " + Ar2.join("+") + " / " + (Ar1.join("+") == Ar2.join("+"))); 今回の内容で言えば、「↓こうなった時に検知したいのです」と 記述されている二次元配列を別の配列で用意(例 kounatta) kounatta = new Array(); kounatta[0] = new Array(1, 1, 1, 1); kounatta[1] = new Array(1, 1, 1, 1); kounatta[2] = new Array(1, 1, 1, 1); kounatta[3] = new Array(1, 1, 1, 1); そして、条件判別は if(nijigen.join("+") == kounatta.join("+")){ //nijigenとkounattaが同じ内容になっている時はここを通るよ } のようにすると、視覚的にもわかりやすいかなと思います (今回に限っては配列の長さが一定なので"+"の効果は得られませんが・・・) 他には前途二次元配列同士を直で if(nijigen eq kounatta){~} なんて方法もあります ただ 区切りの判別が付かない問題点は有りで、 更に eq の使用はFlashPlayer5以降は非推奨なので、 こんなのもあるんですよ程度で。 他にわかりやすい方法を挙げると、今回はボタンが16個なので、 「配列の内容が全て1になった時」ではなく、 「カウントが16になったら」という考え方もあります nijigenの定義と一緒に、 clickCnt = 0;//カウント clickMax = 16;//カウント最大数 のように変数を用意してあげて、ボタン押下時のアクションは if(nijigen[自分の担当][自分の担当] != 1){ //自分の担当部分が1じゃなかった時はここを通る nijigen[自分の担当][自分の担当] = 1;//自分の担当部分を1にして clickCnt++;//カウントを1プラスする } あとはカウント最大数に達しているかどうか調べることで、 if(clickCnt == clickMax){ //ここを通る時は全て押されてる時だよ } 「配列の内容が全て1になった時」の検知と同じ目的を果たせます nijigenをカウントアップの判別用フラグとして使用するという感じです ちなみにこれは別に2次元配列ではなくてもいいですね 個別のアクション時にできるだけ処理を軽くするための一例です

noname#77303
質問者

お礼

カウントアップの方法もあったのですね。 ボタンを離した時には1を減算すれば元に戻るでしょうし、一人で考えるよりも相談したほうが、いろいろな事が見つかるものですね。 回答ありがとうございました。

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.3

面白い(興味をそそられる)ご質問ですね。 スクールなどの課題などで出題されると良い問題だと思います。 私もまず, #1の方の書かれていらしゃる方法を思いつきました。 #1の方の方法とは,つまり,  「for文 か while 文などで,   if文 か case文 判定を総当たりで連続実行して,   1以外のものが発見できたら brake させれば良い。」 という意味のことだと思います。 しかし..., もちょっと楽な方法はないかと思案してみましたら, なんとか,「一刀両断バサッ!」 的な方法を考えつきました。 こんな方法はいかがでしょうか↓。 --------------------------------- 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); // 照合用文字列を用意 mojiretsu = "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"; // if文 照合判定 if (nijigen.join() == mojiretsu) { trace("nijigen の要素は全て1"); } --------------------------------- join() は 配列のエレメントを全て 「,」 で区切って結合します。 この方法だと,1回のif文使用で判定ができます。 また,toString() を使って, if (nijigen.toString() == mojiretsu) { trace("nijigen の要素は全て1"); } のようにしても良いと思います。 if文の等価演算子は,2つある別の配列の等価を判定しません。 case文でも同じです。 したがって, 1,1,1,… という文字列をあらかじめ用意しておいて, その文字列と,一度文字列に変換した配列とが,等価であるかどうか判定させています。 またこの方法だと,「全て1」とかいう限定条件でなく, 配列が ,  1,2,3,4  3,4,5,6  9,8,7,6  2,4,6,8 になっているかどうか? というような複雑な判定も簡単にできます。 ただし, この方法のままでは,  1,2,3,4  3,4,5,6  9,8,7,6  2,4,6,8 と  1,2,3,4,3,4,5,6  9,8,7,6,2,4,6,8 などとの区別ができません。これが問題点です。 しかし,「すべて1」くらいの判定には使えると思います。 === 別案1 ============= ◎ concat() を使う Array.concat() は,パラメータで指定された複数の配列連結して,新しい配列を作成します。 あと Array.sort() も使います。 --------------------------------- 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); // 配列を結合して 一次元配列 ichijigen を作成 ichijigen = nijigen[0].concat(nijigen[1], nijigen[2], nijigen[3]); // 配列 ichijigen を昇り順でソート ichijigen.sort(); // ichijigen の最初の要素と最後の要素がともに1であれば if (ichijigen[0] == 1 && ichijigen[ichijigen.length-1] == 1) { trace("nijigen の要素は全て1"); } --------------------------------- 二次元配列を一次元配列にしてしまって, 中身のエレメントを昇り順にソートしています。 最後の要素も1で,最初の要素も1であれば,全ての要素は1になります。 つまり,最大値も最小値も1なのであれば,全てが1じゃないか。 ということです。 本当は Array.sort() ではm数値は文字列としてソートされます。 したがって, // 配列 ichijigen を昇り順でソート ichijigen.sort(); で本当の数値の大小関係で並ばない場合もありますが, 最初と最後が 1 だったら他も 1 でしょう。 したがって, これも「すべて1」くらいの判定には使えると思います。 「すべて1」くらいの判定に使うのではなく, もっとちゃんとソートしたい場合は次のURLが参考になるかもしれません。 GAC「テキストの最後尾にフォーカスしたい」 http://www.gac.jp/article/index.php?stats=question&category=7&id=6593&command=msg === 別案2? ============= ◎ Math.max() と Math.min() を使う??? AS2 以下では, Math.max() と Math.min() の ( ) 内の引数は2つです。 したがって次のようにしか使えません。 Math.max(a, b); これでは,a と b のうち大きい方の数しか得ることができません。 しかし,AS3 では, Math.max() と Math.min() の ( ) 内の引数に,3つ以上の数を入れられるようになったらしいです。 Math.max(a, b, c, d,…); これで,a , b , c , d ,… のうち一番大きな数を得ることができるそうです。 AS2 では, Math.max() と Math.min() を使って簡単に判定させるには, ----------------------------------- // エレメント2つの一次元配列を作成 var ichijigen:Array = new Array(1, 1); // 配列エレメント中の最大値を a に代入 var a:Number = Math.max.apply(null, ichijigen); // 配列エレメント中の最小値を b に代入 var b:Number = Math.min.apply(null, ichijigen); // a , b ともに 1 であれば if (a == 1 && b == 1) { trace("ichijigen の要素は全て1"); } ----------------------------------- と,これくらいのことしかできません。 しかし AS3 では,同じ "ような" 方法で,二次元配列の最高値と最低値も取れるのではないの??? と思います(未検証です)。 こういう方法もアリかもしれないという別案でした。 =================== 良いですね。 Flash を動かす前の純粋ASという感じのご質問で, 「他にも簡単な方法はないものか…!?」 みたいな感じで,ちょっと思考に燃えてしましました。

noname#77303
質問者

お礼

この1の方法は非常によさそうですね。 joinの存在は知っていたのですが、やはりひらめき力の違いでしょうね^^; 「すべてが1」と言うのはそれほど複雑な条件では無いので、おそらく使えると思います。 一次元配列にしてからsort()を使う方法、Math.max()とMath.min()の方法、は「最小が1、最大が1」のとき、内容は全て1。という考え方なのですね。 僕自身も初心者ながら考えさせてもらった回答でした。 ありがとうございました。

  • is_may
  • ベストアンサー率65% (58/89)
回答No.2

配列を一つ展開するとその中にまた配列があるので2重のforになりますね。 kenshutu=true; for(var i=0;i<4;i++){ for(var t=0;t<4;t++){ if(!nijigen[i][t]){ //一つでも「0」があれば、 kenshutu=false; //「kenshutu」変数を負にして、 break; //forを抜ける。 } } } 二次元配列なので二重forになるのは仕方ないと思います。 パフォーマンスですが、単純なif評価なのでほとんど無に等しいでしょう。 少し前にfor回数が500回、その中の処理が入れ子ifが8回ぐらいあるFlashを作りましたが、立て続けに行っても毎回瞬時に処理されました。 ついでに二次元のように「new Array();」を何回も書くのが面倒な場合は以下のように宣言することも出来ます。スクリプトの自動フォーマットをすると改行がなくなっちゃいますけどね^^; nijigen = [ [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0] ];

noname#77303
質問者

お礼

回答ありがとうございます。 実際にサンプルまで書いていただき、ありがとうございます。 AS自体、初めたばかりなので経験を積んで行きたいと思います。 大変参考になりました。

  • taku2888
  • ベストアンサー率60% (15/25)
回答No.1

やはり、LOOP回すしかないでしょうか。 もし、関数があったとしても結局中身は回してるはず。 ボタンが配置できる数以内で、 押された時だけチェックすればよいのだから パフォーマンスも目に見えるほど落ちないでしょう。 LOOP中、1以外なら抜ければよいので、もっと落ちないと思いますが。

noname#77303
質問者

お礼

回答ありがとうございます。 二次元配列の内容のチェック、ということでforなりwhileなり、の形でループさせる事は想定していました。 ボタンは16個だけなので、パフォーマンスの心配は無いようです。 参考になりました。

関連するQ&A

  • 二次元配列のちょっと複雑な操作

    よく二次元配列について質問させて頂いているのですが、再び失礼します。言葉でそのまま伝えられる自信がないので、ここでは分かりやすいように例を示して書きます。 二次元配列hairetsuは縦横共に0~2ずつの配列で出来ている3×3のマスだとします。 ◆例1◆ hairetsu[0] = new Array(0,0,0); hairetsu[1] = new Array(0,0,0); hairetsu[2] = new Array(0,0,0); そして、hairetsuの中の適当な数箇所の数値を0から1に変えたとします。 ◆例2◆ //乱数を使うなどして適当に代入した結果 hairetsu[0] = new Array(1,0,0); hairetsu[1] = new Array(0,0,1); hairetsu[2] = new Array(1,0,0); このとき、hairetsuの中央に位置するhairetsu[1][1]の周囲(左上、上、右上、右、左、左下、下、右下の8箇所)に1がいくつあるのかを数えたいのですが、なるべく簡潔な方法はありませんでしょうか。 なるべく伝わるように書いたつもりですが、不明な点がありましたら補足させて頂きますので、ご教示よろしくお願いします。

    • ベストアンサー
    • Flash
  • 多次元配列は配列の配列である

    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
  • 多次元配列

    初歩的な質問ですみません。 PHPプログラミングでの質問です。 仮に、多次元配列Aに、 Array( [0] => Array ( [0] => 6 ) [1] => Array ( [0] => 2 [1] => 1 ) [2] => Array ( [0] => 0 [1] => 5 [2] => 4 ) ) 多次元配列Bに、 Array( [0] => Array ( [0] => りんご ) [1] => Array ( [0] => ぶどう [1] => パイナップル ) [2] => Array ( [0] => みかん [1] => すいか [2] => メロン ) ) のように値が入っている場合、配列Aの値を参照して 値の大きいものから順に、それに対応する配列Bの値を取り出し、 あたらしい配列Cに代入する処理の書き方を教えて下さい。 上記の例ですと、配列Cが、 Array ( [0] => りんご [1] => すいか [2] => メロン [3] => ぶどう [4] => パイナップル [5] => みかん ) となるようにしたいです。 よろしくお願いします。 長文失礼しました。

    • ベストアンサー
    • PHP
  • 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
  • 多次元配列への数値の代入。

    こんにちは。 今、多次元配列への数値の代入の仕方で、悩んでいます。 A[][] = new int[n][n]; B[][] = new int[n][n]; 上記のようなn行n列の配列を宣言し、nを入力します。 例えば、n=100と入力すると、100行100列の配列を定義したことになり、Aの配列には1~10000、Bの配列には10001~20000の数値を代入、200×200であれば1~40000、40001~80000…という感じにしたいのですが、いいアイディアが浮かびません。 また、1~nの間でランダムに数値を選び、その数値を代入というのも考えましたが、Javaで乱数を代入できるのかな?という疑問が出来てしまい、わからなくなってしまいました。 何かいい考えがありましたら、ぜひ教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 多次元配列を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
  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • 多次元配列を、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次元配列を扱う方法

    C言語を少しだけやっていました。 JavaScriptで2次元配列作りたいのですが、上手くいきません。 var array[5][5]; array[0][0] = 21; document.write(array[0][0]); ↑を実行しても「21」と表示されません。 new array()とか色々試しましたが上手くいかないので質問させていただきました。 教えてください!

専門家に質問してみよう