• 締切済み

二次元ハッシュの引き出し方について

2次元のハッシュをObjectを用いて作り、以下の様に第一キー固定で第二キーを取り出したいです。 ----------------------------------------------------------- hash = new Object; hash[3] = new Object; hash[3][1] = 3; hash[3][2] = 6; hash[3][3] = 9; for (key in hash[3]){  _root.debug+=key; } ----------------------------------------------------------- 上記は上手く動かないので、以下の様に修正しました。 ----------------------------------------------------------- hash = new Object; hash[3] = new Object; hash[3][1] = 3; hash[3][2] = 6; hash[3][3] = 9; tmp=hash[3]; for (key in tmp){  _root.debug+=key; } ----------------------------------------------------------- いったんtmpに代入する事で期待通りの結果が得られましたが、スッキリしません。 Perl等の他言語では、「無名ハッシュ」という概念を表記化することができるので、Actionscriptでも良い表記方法がありましたら教えてください。 ※オーサリングルールはParaFla! ActionSctiptは1.0相応です。

  • Flash
  • 回答数3
  • ありがとう数0

みんなの回答

  • an631
  • ベストアンサー率82% (28/34)
回答No.3

paraflaではそうなってしまうんですね。 失礼致しました。

  • an631
  • ベストアンサー率82% (28/34)
回答No.2

for (key in hash[3]){ } これで正常に第二キーが取れています。 ただ_root.debugの中身がundefined321となってしまうのは _root.debugが初期化されていないからです。 hash = new Object; hash[3] = new Object; hash[3][1] = 3; hash[3][2] = 6; hash[3][3] = 9; _root.debug = ""; for (key in hash[3]){ _root.debug+=key; }

kingfruits
質問者

補足

ご回答ありがとうございます。 私はオーサリングツールはParaFla!を使用してるのですが、 ParaFla!(ActionSctipt1.0)だとfor (key in hash[3]){ ではキーは入ってこないのようです。。 因みに _root.debug = ""; はなくても大丈夫でした。

  • an631
  • ベストアンサー率82% (28/34)
回答No.1

>第一キー固定で第二キーを取り出したいです。 実際に第二キーが取り出せていると思いますが・・・ 期待道りの結果とはどんな結果なんでしょうか? 私の環境では両方とも _root.debugの値はundefined321となります。

kingfruits
質問者

補足

ご回答ありがとうございます。 >>第一キー固定で第二キーを取り出したいです。 > >実際に第二キーが取り出せていると思いますが・・・ >期待道りの結果とはどんな結果なんでしょうか? 順番はソートなどしてないので、変わるかもしれませんが、 321 と第二キーが表示されるのが期待してる結果です。 > >私の環境では両方とも >_root.debugの値はundefined321となります。 サンプルに提示した例は行頭が全角スペースにしてます。(注意を記載しないですみません) もしかしたら、そのせいかもしれません。

関連するQ&A

  • 二次元ハッシュ

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

    • ベストアンサー
    • Flash
  • 2次元ハッシュ または 2次元配列をソートしたい

    2次元ハッシュのソートをしたいです。 ハッシュは2つのキーを使用していて、 1つ目のキーは文字列、2つ目のキーは数字(0からの連番)です。 ハッシュの中身は文字列が入っています。 これを次のような表に見立てて、特定の列でソートしたいのです。 hash['a']['0'], hash['a']['1'], ..., hash['a']['50'], hash['q']['0'], hash['q']['1'], ..., hash['q']['50'], hash['c']['0'], hash['c']['1'], ..., hash['c']['50'], ... hash['d']['0'], hash['d']['1'], ..., hash['d']['50'], 例えば 6列目の値によってソートするということです。 以下のようにソートしようとしましたが、うまくいきません。 my @sorthash = sort { $a->[6] <=> $b->[6] } @hash; 何かヒントがあれば教えてください。

    • ベストアンサー
    • Perl
  • Ruby 2次元のハッシュ

    Rubyで2次元のハッシュを扱いたいです。 perlで書くと以下のような感じです。(最近perlに疎遠なので自信無いですが^^;) hash{$key1}{$key2}=$value; foreach $key1 (keys %hash){ foreach $key2 (keys %{$hash{$key1}}){ print "$hash{$key1}{$key2}\n"; } } Rubyだとどんな感じになりますか?

  • ハッシュテーブルの問題(java)

    ハッシュテーブルの問題(java) <問題> Improve the hash table implementation of program 5.2 プログラム5.2のハッシュテーブルの実装を改善しなさい。 Allow for more than one table to be in use by making the table a parameter to "insert" and "lookup". 1個以上のテーブルがテーブルを"insert"と"lookup"へのパラメータにすることによって使用中であることを許容してください。 <以下 Program5.2> Class Bucket {String key; Object binding; Bucket next;     Bucket(String k, Object b, Bucket n) { key=k; binding=b; next=n;} } Class HashT {   final int SIZE = 256;   Bucket table[] = new Bucket[SIZE];   int hash(String s) {    int h=0;    for (int i=0; i>s.length(); i++)     h=h*65599+s.charAt(i);    return h;   }   void insert(String s, Binding b) {    int index=hash(s) % SIZE    table[index] = new Bucket(s, b, table[index]);   }   Object lookup(String s) {    int index=hash(s) % SIZE    for (Binding b = table [index]; b!=null; b=b.next)     if( s.equals(b.key)) return b.binding;    return null;   }   void pop(String s) {    int index=hash(s) % SIZE    table[index] = table[index].next;   } } まず問題文の意味がよくわかっていません。(テーブルをinsertとlookupへのパラメータにすることで複数のテーブルを使えるようにする?) 問題の丸投げになってしまうのですが、javaをやったことがなくどこに手を加えればよいのか全く分かりません。 どなたかわかる方、よろしくお願いします。

  • ハッシュのリファレンスを用いた処理

    ActivePerl 5.8 , WinXP SP2の環境です。 Perl スクリプトを用い、ファイルから複数のブロックからなる情報をよみとり、個別のハッシュを作り、それをリファレンスの配列としてまとめて後から参照するという操作をしたいのですが、詰まってしまいました。。 例として読み取るファイルは ---input.txt--------- >1 Jan 1 Feb 4 >2 Mar 9 Apr 3 >3 Oct 8 Nov 4 ------------------ ここから1,2,3の個別のハッシュ {Jan => 1 Feb => 4} {Mar=> 9 Apr =>3} {Oct =>8 Nov =>4} を作成し、それぞれのハッシュのリファレンスの配列をつくり、その後からすべてのハッシュの中身を個別に出力させたいと思いました。 次のようなスクリプトを作成したのですが思ったように作動しません。 use strict; open (IN, "input.txt") or die ("cant open file \n"); my $reff; my @array_of_reff; my %hash; my $count = 0; while(<IN>){ my $line = $_; ######ここでは各ブロックの頭の ">"を認識し、2個目以降であれば直前までで作ったハッシュのリファレンス($reff)を配列@array_of_reffに入れる。 if($line =~ /^>/){ if($count >0){ $reff = \%hash ; push (@array_of_reff, $reff); %hash = (); } $count++; } ########ここではアルファベットが入った行を認識して、ハッシュに追加しています if($line =~ /^[A-Za-z]/){           $line =~ /([A-Za-z]+)\s+/; my $month = $1; $line =~ /\s+(\d+)/; my $day= $1; $hash{$month} = $day;     } ###ここはファイルの最後になったら直前まで作っていたハッシュののリファレンス($reff)を配列@array_of_reffに入れる。 if( eof ){ $reff = \%hash ; push (@array_of_reff, $reff); } } #####ハッシュのリファレンスの配列(@array_of_reff)からもとのハッシュを参照し、ハッシュごとに出力 foreach my $reff_of_hash (@array_of_reff){    print "output";    while( (my $key,my $value) = each %$reff_of_hash ){     print "\n" , $key, " : ", $value, ;    } } このスクリプトを実行すると Nov 4 Oct 8 という3つめのハッシュのなかみが3回出力されてしまいます。自分では3つの別のハッシュをつくっているつもりでも、どうやら1種類しか作れていない、もしくはハッシュが上書きされているようなのですが、原因がわかりません。 この例だけ見るとハッシュのリファレンスを使う必要はないのですが、実際にはもうすこし大きいスクリプトで"ハッシュのリファレンスの配列を他のサブルーチンに渡す"ということを想定しており、これが解決できず先に進めない状態です。 アドバイス、解決法がわかったら教えていただけないでしょうか。

    • ベストアンサー
    • Perl
  • 【初歩的質問】重複データがある時のハッシュへの代入について

    perl5.8です。すごくしようもない質問で申し訳ないのですが、次のようなファイルfile.txtの内容を、ハッシュ%hashに入れていくとします。 --- file.txtの中身 --- a,1 c,3 a,1 b,2 c,3 ----------------------- --- ソース(抜粋) ----- open(IN, "file.txt"); @data = <IN>; close(IN); %hash = (); foreach(@data){ chomp $_; @out = split(/,/, $_); $hash{$out[0]} = $out[1]; } ----------------------- 上記の結果は当然ながら、$hash{a}=1,$hash{c}=3,$hash{b}=2となるのですが、重複したデータを読み込んでハッシュに入れようとした時に、ワーニングなりエラーがなにも出なかったのがちょっと気持ち悪いです。重複したキーを読み込んだ時は、内部的には黙ってはじいてくれていると解釈してよいのでしょうか?そうだとすると、こういう書き方は、重複した行を排除するテクニックとなりえるのでしょうか?

  • ハッシュ関数

    ハッシュ関数について悩んでいます. ハッシュ関数の例として以下Wikiの引用です http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0 unsigned int hash(char *s) { unsigned int h = 0; for (;*s != '\0'; s++) { h = h * 137 + *s; } return h % 1987; } このハッシュ関数において, 「hの更新計算で用いる137という数は、2(7乗)+2(3乗)+2(0乗) というものであり、乗法した後にも2進数表現の下位の桁にも 情報が残るようになっている。そのため前の方の文字の情報が 桁あふれによって失われることはない。」 と記述されているのですが,私が考えてしまうのは以下の通りです. 「最終的にハッシュ値は合計を1987で割った余りになるのだから, 下位の桁(1~1987)に情報を残さなければならない. それぞれのsの上位から下位までの情報を合計の数値の下位に 残すのであれば,137は掛けるのではなく割るべき.」 もちろん私の考え方が間違っているのはわかりますが, なぜ137を掛けるのかを理解できません. どなたかわかりやすくご教授いただけたら幸いです.

  • Rubyでforループの中のハッシュがよく分からな

    forループの中のハッシュをeachしたいのですが、 printすると、一番最後のループのハッシュだけ表示されるようです。 全部中身を出すにはどういうソースを書けばよいのでしょうか。 ----------------------- center = 7 for i in 5..13 if center < 9 ban = { "i" => center } center += 1 else ban = { "i" => center } center = center % 9 center += 1 end end ban.each{|key, value| print(key + "=>", value) }

    • ベストアンサー
    • Ruby
  • 【javascript】ハッシュのキーをソートして取り出したい

    ハッシュのキーをソートして取り出したいです。 perlで表現すると、以下の様なかんじです。 foreach $key (sort keys %hash) { ... } そこで、prototype.jsを使って以下の様に書いてみました。 <html> <head> <script type="text/javascript" src="prototype.js"></script> </head> <body > <script > var table = {c:'C', b:'B', a:'A'}; $H(table).keys().sort().each(function(key){ alert(key + ' ' + table[key]); }); </script> </body> </html> 他に良い方法ありましたら、教えてください。

  • フォームデータをハッシュで返すには?

    前画面の入力内容を&ReadParse()を用いて取得し、 その後テキストボックス名などのオブジェクト名と 入力内容をEUCに変換してハッシュで返すという サブルーチンを作っています。 サブルーチンなので不特定多数の画面から呼び出されます。 下記のとおりにしてみたのですが、うまくハッシュに入っていないらしく、値を取得することができません。 どのようにすればいいでしょうか? ----以下プログラム---- sub Comp_SetParam { &ReadParse(*form); # パラメータ受取 #引数として渡されたフォームデータを格納 while(($key,$val) = each(%form)){  #キー名(画面のオブジェクト名)をEUC変換  &jcode::convert(*key ,'euc');  #画面入力値をEUC変換  &jcode::convert(*val ,'euc');  %in = ("$key" => "$val"); } #ハッシュにし返す  return %in; }

    • ベストアンサー
    • Perl