从字符串数组中散列

时间:2019-04-08 19:34:02

标签: ruby

我是Ruby的新手(通常是编码人员),尝试将数组转换为哈希,其中键为单词,值为单词在数组中出现的次数(例如“ banana” => 1,“芒果” => 2等)。

我正在尝试使用each_with_object这样做,因为它应该可以从数组中构建新哈希。

array = %w(banana pear mango kiwi mango)

hash1 = array.each_with_object(Hash.new(0)) do |word, count|
  hash1[word] = count
  count += 1
  return hash1
end

puts hash1

但是代码根本不起作用。有人可以向我解释为什么不这样做以及我应该改变什么吗?

谢谢!

4 个答案:

答案 0 :(得分:3)

要使代码正常工作,您需要修复使用each_with_object的方式。

array = %w(banana pear mango kiwi mango)

hash1 = array.each_with_object(Hash.new(0)) do |word, counts|
  counts[word] += 1
end

puts hash1

Hash.new(0)是一个哈希,在读取未知密钥时返回零。因此,您在这里要做的是通过迭代array并将每个键的计数增加一个来填充它。

我建议阅读更多有关reduce和each_with_object的内容,以了解其用法。

Fabio的答案是比较惯用的答案,但我只是想展示如何修复代码而不是重写代码。

答案 1 :(得分:1)

使用最新的红宝石(itselftransform_values方法),您可以执行以下操作:

%w(word one two word).group_by(&:itself).transform_values(&:length)
# => {"word"=>2, "one"=>1, "two"=>1}

哪里

.group_by(&:itself)
# returns => {"word"=>["word", "word"], "one"=>["one"], "two"=>["two"]}

.transform_values(&:length)
# returns => {"word"=>2, "one"=>1, "two"=>1}

答案 2 :(得分:1)

不知道它是否有效,但是它的替代方法 %w[banana pear mango kiwi mango].group_by{|x| x}.map{|key, values| [key, values.length]}.to_h

答案 3 :(得分:0)

虽然您可以按照上面的说明修复代码,但我还是喜欢提供这种替代方法:

array.zip.group_by(&:first).transform_values(&:size)
#=> {"banana"=>1, "pear"=>1, "mango"=>2, "kiwi"=>1}