人に聞けない痔の悩み、これでスッキリ >>

Rubyで2次元のハッシュを扱いたいです。

perlで書くと以下のような感じです。(最近perlに疎遠なので自信無いですが^^;)

hash{$key1}{$key2}=$value;

foreach $key1 (keys %hash){
foreach $key2 (keys %{$hash{$key1}}){
print "$hash{$key1}{$key2}\n";
}
}

Rubyだとどんな感じになりますか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

たく面倒くせえなあ(笑)



何もせずに
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] = {} }
の『= {} 』の意味を説明して頂けませんか?

補足日時:2007/11/07 20:15
    • good
    • 0

んー実行して結果を確かめてから書き込みしたんで


エラーが出るのは納得できないなあ。

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の方が楽だと思ってしまいます。

補足日時:2007/11/07 22:39
    • good
    • 0

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

上記の様に書きたく、データのキーのバリエーションが変わっても対応できるようにしたいです。

補足日時:2007/11/07 10:06
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QrubyでC言語のexitにあたる構文は?

現在、C言語のプログラムをrubyに書き換えています。

そこで、C言語のexitに当たるrubyの構文、もしくは、
文法が見つからず、困ってます。
(ある条件になったら、強制的にrubyの実行を
 停止させたいのですが、、、)
(__END__ですか?)

詳しい方が居ましたら、ご指南下さい。

Aベストアンサー

#2です。
>exit のあとの数字について詳しく知らないので、
>教えていただけたら幸いです。
exitのあとの数字は終了コードといって、どのような状態で、このプログラムが終了したかを、呼び出しもとに伝える為のものです。
この値は、呼び出し元と、呼び出される側(このプログラム)との決め毎なので、どのようにきめてもかまわないのですが、
ふつうは、終了コード:0で終了したときが、正常終了にします。
それ以外の値は、異常終了を示す値にします。

この終了コードは、なにかのサブルーチンを作ったときの、戻り値に似ています。
サブルーチンの戻り値は、呼び出しもとと呼び出される側(サブルーチン側)とで、自由にきめて良いのですが、
通常は、正常:0、以外は、それなりの異常にしますよね。

QRubyの変数を含んだ正規表現について

下のように正規表現でlineと
1=,2=などから始まる行を抽出する
プログラムですが、どうやら正規表現の左辺(//の中身)
には変数は使えないようです。iが文字として
認識されているようです。
解決策を教えてください。

while line = io.gets
 20.times{ |i|
  if /^i=(.*)/ =~ line
  p $1
 }
end

Aベストアンサー

if /^i=(.*)/ =~ line を
if /^#{i}=(.*)/ =~ line
として下さい。#{i}とすることにより、iが変数展開されます。
蛇足ですが、提示されたスクリプトは実行時エラーになります。正しい、スクリプトを期待する場合は、その旨補足下さい。

Qapt-get install ****** でinstallしたものをuninstallするには?

御世話になります。
vncserverだけをinstallするつもりが
誤って
apt-get install vncとうってしまいました。
これをuninstallしたいのですが
どのようにすればよろしいでしょうか?

教えて下さい。

Aベストアンサー

# apt-get remove パッケージ名
では、設定ファイルは削除されずに残ります。

完全に削除するときは、
# apt-get --purge remove パッケージ名
です。

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

Qプログラム設計書の書き方

僕は新人SEです。
今、上司の方からあるシステムの基本設計書・システム設計書・プログラム設計書を作り、プログラミングまでしてから単体テスト・結合テストもやるように言われています。(全て1人で)

おそらく経験のある方ならすぐにできてしまうようなシステムで、上司の方も勉強のために全てやらせているようです。

今、基本設計書・システム設計書まではなんとかできて、プログラム設計書の作成に取り掛かりたいのですが、初めての経験で実際のプログラム設計書には何をどのように書いているものなのかも全く見当もつかずにいるので全く何も書けません。

上司さんは今週忙しいようで
「来週見てあげるから自分で調べたりしてやってみて」
と言っています。
ですが、全く何もできずにいるのもイヤなので何かそれらしいものでも書いてみたいのですが…プログラム設計書とは何をどう書いてあるものなのでしょうか?

日本語が書いてあるのかプログラムが書いてあるものなのか…
そういったところからわからないので少しでも何か教えていただきたいです。
宜しくお願いします。

Aベストアンサー

こんにちは。
No.1様のご回答通りなのですが会社によって異なります。
というのを踏まえた上で・・・うちではという回答になりますが

・日付 2009/10/10
・版 初版(その後バージョンアップで改定するため、改定ナンバー必須)
・タイトル 企業情報印刷(ここでは決定済み名称)
・発注仕様書ナンバー(正式にお客さまと契約で決めた発注番号を記載)
・作成者 boo_boo_suu
・使用言語 Visual C++
・使用データベース ORACLE
・使用帳票アプリケーション Crystal Reports
・フロー図(Visioで埋め込み図)
・概要説明 
メインメニューから呼び出され企業情報の印刷条件を入力し、クリスタルレポートの帳票情報から企業情報ファイル(KIGYOU_INFO)ファイルを呼び出し印字します。
・全企業情報が一覧で印字可能である。
・特定一企業(企業コード指定)での印字も可能である。
・一企業が指定された場合は企業情報を画面表示する。

-----------------------------------
で・・・・プログラム仕様書はこのくらい。
命令書ですからコードそのものは打ちません。
これみて作ってもらわないといけないので日本語メインです。

あとはDBの仕様書をみてもらったりしてプログラムのローカルルール、画面サイズ、文字サイズ プロシージャ定義やら定数や変数、フォーム、構造体定義書などプログラム書くときの決まりごとに添ってPGさんに打ってもらっています。
一応、図とかつけてみました。(^-^;;
全体の雰囲気はこんな感じだとご理解いただければ幸いです。
ではでは~。

こんにちは。
No.1様のご回答通りなのですが会社によって異なります。
というのを踏まえた上で・・・うちではという回答になりますが

・日付 2009/10/10
・版 初版(その後バージョンアップで改定するため、改定ナンバー必須)
・タイトル 企業情報印刷(ここでは決定済み名称)
・発注仕様書ナンバー(正式にお客さまと契約で決めた発注番号を記載)
・作成者 boo_boo_suu
・使用言語 Visual C++
・使用データベース ORACLE
・使用帳票アプリケーション Crystal Reports
・フロー図(Visioで...続きを読む

QClassの中のClass定義について

Classの中のClass定義について

主にWindows環境でrubyを使用しているライトユーザーです。
ネットでソースを拝見していると、Class定義の中に更にClass定義がされているプログラムをみることがあります。以下のような感じですね。

Class Foo
 Class Bar
 ……
 end
……
end

このようにClass定義を他のClass定義の中に書くのは、どのような理由によるのでしょうか?
素朴な疑問です、ご教示いただければ嬉しいです。

Aベストアンサー

名前空間ですね。

class Foo
 class Bar
 ……
 end
……
end
class Hoge
 class Bar
 ……
 end
……
end
class Bar
 ……
end

だと、それぞれの、Barクラスは別物で、それぞれFoo::Bar、Hoge::Bar、Barという名前のクラスになります。ただし、クラスFooの中ではFoo::BarはBarと略記できるし、Hogeの中ではHoge::BarをBarと略記出来ます。

例えば、Fooクラスの中でしか利用しないクラスがあった場合に、他のクラスと名前の衝突を気にすることなく名前を付けることが出来るわけです。ただし、Fooクラス外からもFoo::Barのように利用することが出来るので、Fooクラス内に隠蔽できるわけではないですが。

定数などもクラスの中で定義すれば、Foo::CONSTNAME のような定数が出来ます。

Qインスタンス内から自分のクラス名を取得する方法

クラスインスタンス内から自分のクラス名を取得しようと思うと、self.class.nameで取得できますが、type.nameでも取得できます。
しかし、typeは非推奨メソッドとなっているため、警告が出て、このままでは使用することができません。

素直にself.classを使えばいいのかもしれませんが、selfのワンクッションがどうにも気に入りません。

スマートな記述方法あったら教えて下さい。

# self.class.nameを使用する場合
class MyClass
 def print_classname
  puts self.class.name
  # puts class.name これはエラー
 end
end

# type.nameを使用する場合
class MyClass2
 def print_classname
  puts type.name # これはdeprecatedの記述で警告が出る
 end
end

Aベストアンサー

self を書きたくないということなら、
alias :xclass :class
しておいて、
xclass.name
するくらいしかないと思います。スマートとは思いませんけど。

逆に、インスタンスメソッド定義の中で、class以外のメソッド呼び出しの時もselfを省略しないで書くことにすれば、全部統一が取れます。

Qhtml で 変数を定義できますか?

html(できればjava不使用)で変数に文字列をいれてつかう、またはそれに近いことはできないでしょうか?

例**************************
$color1="#000000"

<tr bgcolor=$color1>内容1<tr>
<tr bgcolor=$color1>内容2<tr>
****************************
みたいな感じです

Aベストアンサー

調べりゃ分かることは???だけど。

CSS2で無理やり作れば・・簡単だけど・・・
生成内容、自動番号振り、リスト ( http://www.swlab.it.okayama-u.ac.jp/man/rec-css2/generate.html )
 本来はXSLTで作るほうがよいかと・・・
 <th><xsl:value-of select="parson" />の歌</th>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
<title>サンプル</title>
<meta name="author" content="ORUKA1951">
<meta http-equiv="Content-Style-Type" content="text/css">
<link rev="made" href="mailto:orika1951@hoge.com" title="send a mail" >
<link rel="START" href="../index.html">
<style type="text/css">
<!--
.parson1:before{content:"田中";}
p.age1:after{content:"36歳";}
-->
</style>
</head>
<body>
<h1>サンプル</h1>
<p class="parson1">は男の子</p>
<p class="parson1 age1">の年齢は</p>
<p>私の彼氏は<span class="parson1">君だよ</p>
</body>
</html>

調べりゃ分かることは???だけど。

CSS2で無理やり作れば・・簡単だけど・・・
生成内容、自動番号振り、リスト ( http://www.swlab.it.okayama-u.ac.jp/man/rec-css2/generate.html )
 本来はXSLTで作るほうがよいかと・・・
 <th><xsl:value-of select="parson" />の歌</th>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
<title>サンプル</title>
<met...続きを読む

QWindows7 zip圧縮・解凍のコマンド

同様の質問があったらすみません。

OS Windos7 では、標準でzipファイルの圧縮・解凍ができるようですが、
この操作をcmd.exeを使って行いたいと考えています。

質問(1)
そのようなコマンドはありますか?

質問(2)
コマンドがあれば、教えてください。
または、参照できるホームページ等教えていただけませんか?

よろしくお願いいたします。

Aベストアンサー

> コマンドがあれば、教えてください。

Win7はzipfldr.dllで処理しています。
RouteTheCall パラメータはfilename.zipのサブフォルダに
filenameフォルダを作成して解凍ファイルを格納します。
filenameにはzipファイル名を指定してください。

rundll32.exe zipfldr.dll,RouteTheCall filename.zip


人気Q&Aランキング