No.2ベストアンサー
- 回答日時:
たく面倒くせえなあ(笑)
何もせずに
hash{$key1}{$key2}=$value;
のような感じで
h[key1][key2]=val
ができないのをどうにかしたい、って書いてくれれば
ちゃんとそうやったのに。
h = Hash.new{|hash, key| hash[key] = {} }
while line = DATA.gets
key1,key2,val = line.split(/\s*,\s*/)
h[key1][key2]=val unless (key1.nil? or key2.nil? or val.nil?)
end
h.keys.each do |key1|
h[key1].keys.each do |key2|
puts "h[#{key1}][#{key2}]=#{h[key1][key2]}"
end
end
__END__
1,1,1
2,3,6
4,4,16
9,9,81
-------
h[1][1]=1
h[2][3]=6
h[4][4]=16
h[9][9]=81
これでいいですか?
この回答への補足
毎度、お世話になります。
切り取って実行してみると、以下エラーになってしまいます。
undefined method `[]=' for nil (NameError)
あと、一行目のところが理解できません。
h = Hash.new{|hash, key| hash[key] = {} }
の『= {} 』の意味を説明して頂けませんか?
No.3
- 回答日時:
んー実行して結果を確かめてから書き込みしたんで
エラーが出るのは納得できないなあ。
C:\Users\>ruby190 -v moge.rb
ruby 1.9.0 (2007-11-05 patchlevel 0) [i386-mswin32_71]
mogera.rb:7: warning: shadowing outer local variable - key1
mogera.rb:8: warning: shadowing outer local variable - key2
h[1][1]=1
h[2][3]=6
h[4][4]=16
h[9][9]=81
C:\Users\>ruby186 -v moge.rb
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
h[9][9]=81
h[1][1]=1
h[2][3]=6
h[4][4]=16
ご覧の通りエラーのえの字もありません。
> h = Hash.new{|hash, key| hash[key] = {} }
> の『= {} 』の意味を説明して頂けませんか?
これは空の無名ハッシュです。
変数を空の配列として初期化するときに
v = []
のようにできますが、それのハッシュ版です。
全体としてハッシュの初期化なので、= Hash.key }
のようにもう一回 Hash.new とかくのがいやだったので
そうしています。
この回答への補足
ruby 1.6.1を使用してた為みたいです。
ruby 1.8.6 に乗り換えたらエラーなしでした。
お騒がせしました。
因みに、キーが3つだったら、以下の様に書くんですね?
h = Hash.new{|hash, key| hash[key] =Hash.new{|hash, key| hash[key]={}} }
#perlの方が楽だと思ってしまいます。
No.1
- 回答日時:
Perlの例に合わせるならこんな感じでしょうか
h = Hash.new
h['foo'] = Hash.new
h['bar'] = Hash.new
h['baz'] = Hash.new
h['foo']['xx'] = 1
h['foo']['yy'] = 2
h['bar']['zz'] = 3
h['bar']['aa'] = 4
h['baz']['bb'] = 5
h['baz']['cc'] = 6
h.keys.each do |key1|
h[key1].keys.each do |key2|
puts h[key1][key2]
end
end
この回答への補足
回答ありがとうございます。
ご回答頂いた例ですと、第一キーとなるfoo.bar,bazを予め知ってるって感じじゃないですか。
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
上記の様に書きたく、データのキーのバリエーションが変わっても対応できるようにしたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- JavaScript Json のキーと値の出力の違いについて 2 2022/06/14 20:22
- CPU・メモリ・マザーボード USB Key 2 2022/07/06 14:25
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- その他(プログラミング・Web制作) pythonにおける単方向リストの実装について 4 2022/07/13 12:34
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- Visual Basic(VBA) シフト表のコマで「ブロック」されている前の時間の「出」を同一列の「休」と入れ替えたいがふぇきません。 2 2023/08/02 18:49
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- JavaScript SQLでデータベースから返ったデータのJSON形式生成について 1 2022/04/06 12:25
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
foreachの間にテーブルの<TR>を...
-
キーが倍数の時の値の存在チェ...
-
$_POST受信で必要項目のみを結...
-
Smartyでインクリメント
-
smartyでtplファイルでの2次元配列
-
ftokが動かない?
-
PHPで変数名にハイフンを使うに...
-
プログラミングのPythonのnoteb...
-
読み(あ行~わ行)ごとに分け...
-
行列
-
プルダウンメニューにDBの内容...
-
PHPのカッコ[ ]の使い方について
-
スカラーのベクトル微分
-
再帰関数を用いて配列の合計を...
-
PHP初心者ループ
-
C言語 最大値と最小値を求めて...
-
別ファイルの構造体の値を読み...
-
String だと「 ByRef引数の型が...
-
配列一致(要素順番は違うが内容...
-
エラーメッセージ(無効な間接...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マッチング処理(1:N)
-
smartyのforeachの使い方
-
foreachで上限回数指定方法また...
-
多次元配列を、1次元の配列にす...
-
foreachの間にテーブルの<TR>を...
-
PHP、{}記号の意味
-
$_POST受信で必要項目のみを結...
-
3つの連想配列を交互に代入し...
-
VB.NET で 二次元のハッシュは...
-
PHP:ツリー構造をulとli要素に...
-
foreachで配列を、左から縦3列...
-
PHPの構文で間違えが分からない
-
PHPで連想配列のプルダウンメニ...
-
添え字が全て文字列のPHPの多次...
-
POSTで渡されるデータの数がわ...
-
テーブルデータ表示
-
Smartyでインクリメント
-
PHPで変数名にハイフンを使うに...
-
Delphi XEの警告文を消したい
-
配列から順位を算出したい
おすすめ情報