将数组拆分为哈希

时间:2014-10-14 21:40:15

标签: ruby arrays hash

我希望拆分一个字符串数组并从中创建一个哈希值。

我有一个算法,可以用逗号this:1, is:1, a:1, string:1

将字符串拆分成数组
def split_answer_to_hash(str)
    words = str.split(',')
    answer = {}
     words.each do |w|
        a = w.split(':')
        h = Hash[ *a.collect { |v| [ v, a[1] ] } ]
        answer = h
    end
    answer
end

我现在需要做的是使冒号的左侧成为散列的关键,而冒号的右侧是散列的值。例如:{"this" =>1, "is"=>1, "a"=>1, "string"=>1 }

*a.collect正在遍历数组并使值成为另一个键。我怎么能解决这个问题呢?

2 个答案:

答案 0 :(得分:4)

最简单的方法是:

string = 'this:1, is:1, a:1, string:1'
hash = Hash[*string.split(/:|,/)]
#=> {"this"=>"1", " is"=>"1", " a"=>"1", " string"=>"1"}

答案 1 :(得分:1)

对这个问题只有一个答案就是不会这样做:

str = "this:1, is:1, a:1, string:1"

Hash[str.scan(/(?:([^:]+):(\d+)(?:,\s)?)/)]
  .tap { |h| h.keys.each { |k| h[k] = h[k].to_i } }
  #=> {"this"=>1, "is"=>1, "a"=>1, "string"=>1}

Object#tap仅用于将值从字符串转换为整数。如果您愿意:

h = Hash[str.scan(/(?:([^:]+):(\d+)(?:,\s)?)/)]
h.keys.each { |k| h[k] = h[k].to_i }
h
  #=> {"this"=>1, "is"=>1, "a"=>1, "string"=>1}

对于Ruby 2.1,您可以将Hash[arr]替换为arr.to_h