我希望拆分一个字符串数组并从中创建一个哈希值。
我有一个算法,可以用逗号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
正在遍历数组并使值成为另一个键。我怎么能解决这个问题呢?
答案 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
。