• ベストアンサー

二次元ハッシュ

hash[3][3]=9; 上記のように、2次元のハッシュを使いたいです。 1次元のハッシュは hash1= new Object(); と定義して、 hash['key']=1; などとアクセスすればよいのは調べたのですが、2次元の場合はどのように定義するのか教えてください。 ※オーサリングツール『はParaFla!』ActioScitptは1.0相当です。 よろしくお願いいたします。

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

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

すみません,#2(#1)です。 #2 のスクリプトはデータが Dat = "1,1,1\n2,3,6\n4,4,16\n9,9,81"; であるから動作するだけでした。 このデータは,ハッシュの最初のキーが複数かぶっていないデータです。 普通はかぶると思うので, 親オブジェクト h の 子オブジェクト ○ が存在しないときに限って h.○ = new Object(); をしないとダメでした。 この処理を入れておかないと, 前に作成した h.○ が次に作成した h.○ によって消えてしまいます。 したがって, #2で書いたスクリプトを次のように訂正します。 -------------------------------------------------- // 何某かのデータ Dat がだあったとする(\nは改行コード) Dat = "1,1,1\n1,8,8\n4,4,16\n9,9,81"; // オブジェクト h を作成 h = new Object(); // データを改行コードで split した配列 Arr を作成 Arr = Dat.split("\n"); // Arr の要素数分ループ for (i=0; i<Arr.length; i++) { // h[Arr[i].split(",")[0]] が 存在しない場合 if (!h[Arr[i].split(",")[0]]) { // オブジェクト h[○] を作成 (○は 1,1,4,9 が入る) h[Arr[i].split(",")[0]] = new Object(); } h[Arr[i].split(",")[0]][Arr[i].split(",")[1]] = Arr[i].split(",")[2]; } // ---検証--------------- trace("h[1][1]="+h[1][1]); trace("h[1][8]="+h[1][8]); trace("h[4][4]="+h[4][4]); trace("h[9][9]="+h[9][9]); --------------------------------------------------

kingfruits
質問者

お礼

なるほどぉ!!  第1キーが初出の時にh[第1キー] = new Object(); するのですね。 ご回答ありがとうございました。

その他の回答 (2)

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

#1です。 > 第一キーのSakana(魚)Yasai(野菜) Nik(肉) を > 予め知ってるって事が前提ですよね。 最初の例がそうですから,そうしています。 "Sakana" や "Yasai" のように二重引用符でくくって(一重引用符でも同じ), 文字列データを直接代入しているので変えられないだけです。 変数などにすれば変えられます。 >以前、同じように二次元のハッシュについて他の言語Rubyで質問したことがあります。 > (http://oshiete1.goo.ne.jp/qa3495160.html) そこに書かれていらっしゃる, 次の文が何を意味しているのか正確には理解できません。 > while line = DATA.gets > key1,key2,val = line.split(/\s*,\s*/) > h[key1][key2]=val > end > __END__ > 1,1,1 > 2,3,6 > 4,4,16 > 9,9,81 特に __END__ の後の数の羅列は何なのだろう? とは思いますが, この羅列は文字列データであって, ここから2次元ハッシュを作成するのではないかとは, 他の回答者の回答を見てなんとなくわかりました(多分)。 上のスクリプト(?)が,何を意味しているのか正確には理解できませんが, 次のような感じでよろしいでしょうか? ------------------------------------------- // 何某かのデータ Dat がだあったとする(\nは改行コード) Dat = "1,1,1\n2,3,6\n4,4,16\n9,9,81"; // オブジェクト h を作成 h = new Object(); // データを改行コードで split した配列 Arr を作成 Arr = Dat.split("\n"); // Arr の要素数分ループ for (i=0; i<Arr.length; i++) { // オブジェクト h[○] を作成 (○は 1,2,4,9 になる) h[Arr[i].split(",")[0]] = new Object(); h[Arr[i].split(",")[0]][Arr[i].split(",")[1]] = Arr[i].split(",")[2]; } // ---検証--------------- trace("h[1][1]="+h[1][1]); trace("h[2][3]="+h[2][3]); trace("h[4][4]="+h[4][4]); trace("h[9][9]="+h[9][9]); --------------------------------------------- 本題は, ハッシュの作成 と言うよりも, 文字列データ解析操作 という感じです。

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

二次元配列 ではなく, また, 一次元配列にハッシュを入れたものでもなくて, 二次元ハッシュですか? ハッシュ自体が,そもそも二次元配列(n行2列)のようなとらえ方もできますからややこしいですが, 結局, オブジェクトの中にオブジェクトを作成すれば良いと言うことになりますよね。 ムービークリップの中にムービークリックを入れる(スプライトの中にスプライトを入れる)というような感覚。 ですから,次のようになると思います。 ---------------------------------------------------- // オブジェクト Syouhin(商品) を作成 Syouhin = new Object(); // オブジェクト Sakana(魚) を作成 Syouhin.Sakana = new Object(); Syouhin["Sakana"]["Tai"] = 2500; Syouhin["Sakana"]["Saba"] = 300; Syouhin["Sakana"]["Sanma"] = 100; Syouhin["Sakana"]["Hirame"] = 4200; // オブジェクト Yasai(野菜) を作成 Syouhin.Yasai = new Object(); Syouhin["Yasai"]["Kabotya"] = 520; Syouhin["Yasai"]["Daikon"] = 230; Syouhin["Yasai"]["Ninjin"] = 150; // オブジェクト Niku(肉) を作成 Syouhin.Niku = new Object(); Syouhin["Niku"]["Gyuu"] = 200; Syouhin["Niku"]["Buta"] = 180; Syouhin["Niku"]["Tori"] = 160; // 出力(例) trace("商品/魚/サンマ:"+Syouhin["Sakana"]["Sanma"]+"円"); trace("商品/肉/牛:"+Syouhin["Niku"]["Gyuu"]+"円"); ---------------------------------------------------- ちなみに, 見かけの雰囲気を二次元ハッシュらしくしたかったので,  Syouhin["Sakana"]["Tai"] = 2500; のような書き方をしていますが, 結局これは,  Syouhin.Sakana["Tai"] = 2500; と同じ事です。 Syouhinはネスト構造の階層をもつオブジェクトです。 ParaFla! でも, 「プレビュー」→「トレースウィンドウを表示」 「プレビュー」→「プレビューウィンドウ」 で動作確認はしています。

kingfruits
質問者

補足

ご回答ありがとうございます。 >二次元配列 ではなく, >また, >一次元配列にハッシュを入れたものでもなくて, >二次元ハッシュですか? はい。二次元のハッシュです。 >Syouhin["Sakana"]["Tai"] = 2500; >のような書き方をしていますが, >結局これは, >Syouhin.Sakana["Tai"] = 2500; >と同じ事です。 確かにその通りですね。 二次元のハッシュが欲しくなるって事は、実現しようとしてる事の整理の仕方が悪いのかもれません。 ご回答頂いた例ですと、第一キーのSakana(魚)Yasai(野菜) Nik(肉) を予め知ってるって事が前提ですよね。 プログラムを実行時に取得した値をキーにしたいです。 P.S 以前、同じように二次元のハッシュについて他の言語Rubyで質問したことがあります。(http://oshiete1.goo.ne.jp/qa3495160.html