HashとArrayはRubyにおいて同一に扱える。
2x1 の行列は、Hashになる。
2xn のn行配列はHashにできる
サンプル
a-f の文字列で配列を作る
>> ("a".."f").map{|e| e} => ["a", "b", "c", "d", "e", "f"]
これを [[a,97],[b,98],,,,,]と文字と文字コードの配列の配列にする
>> ("a".."z").map{|e| [e,e[0]]} >> ("a".."f").map{|e| [e,e[0]]} => [["a", 97], ["b", 98], ["c", 99], ["d", 100], ["e", 101], ["f", 102]]
これを{ "a"=>97 , "b"=>98,,,} のようなハッシュにする
>> Hash[*("a".."f").map{|e| [e,e[0]]}.flatten] => {"f"=>102, "e"=>101, "d"=>100, "c"=>99, "b"=>98, "a"=>97}
簡単ですね。flattenがミソ。
変換をミスると悲劇に。
>> Hash[*("a".."f").map{|e| [e,e[0]]}] => {["a", 97]=>["b", 98], ["e", 101]=>["f", 102], ["c", 99]=>["d", 100]}
配列をキーにした、Hashが出来る。(配列がHashにキーになって驚き!!)
何に使うのか?
結構便利。CSVファイルの読み書きに便利だと思いました。
CSVを読み書きするのです
f = open test.csv , r str = f.read str = str.toutf8 csv = str.lines.map{|e| e.split /,/ } header = csv.shift #ヘッダ行を考慮する。 csv.map{|e| Hash[ *header.zip(e) ]} csv.map{|e| Hash[*header.zip(e).flatten]} #これを yieldで出せれば完璧ね。 list = csv.map{|e| Hash[*header.zip(e).flatten]}
そこそこそ行けそう