Ruby 文字列をハッシュに変換

  • 19
    Like
  • 2
    Comment

"x: 100, y: 200, z: 300" のような文字列を
{x: 100, y: 200, z: 300 }のようなハッシュ{sym: int}に変換する方法
ruby2.2で探してみたところ、それ用のメソッドが無いようなので書いてみた。

補足

2.1以降 Array#to_h
それ以前 Hash[ ]

パターン1 一旦配列にする

文字列を":"と","区切りで二次元配列にして、それを二個ずつ取り出してハッシュに変換する。

def to_hash(str)
  array = str.delete(' ').split(/[:,]/)
  array.each_slice(2).map {|k, v| [k.to_sym, v.to_i] }.to_h 
end

パターン2 eval使う(要注意)

超簡単、ruby怖い。

def to_hash(str)
  eval("{#{str}}")
end

パターン3 scanで正規表現を使う (追記)

@jnchitoさんより。

def to_hash(str)
  str.scan(/(\w+):\s+(\d+)/).map{|k, v| [k.to_sym, v.to_i] }.to_h
end

速度比較

上記の2つをそれぞれ1000回実行した平均(小数点2桁目以降は誤差みたいなものなので省略)
※パターン3を追記

  • "x: 100, y: 200, z: 300"
パターン1  4.2e-06
パターン2  4.8e-06
パターン3  3.6e-06
  • "x: 100, y: 200, z: 300, a: 1000, b: 20"
パターン1  5.7e-06
パターン2  5.7e-06
パターン3  4.8e-06
  • "x: 100, y: 200, z: 300, a: 1000, b: 20, c: 800"
パターン1  6.4e-06
パターン2  6.3e-06
パターン3  5.6e-06

追記したパターン3が最も速い結果になった。
要素が増えるにつれパターン3と他との差が開いていく。

もっと良い方法があったりしたらおねがいします!