ruby 从字符串数组中生成散列

xxb16uws  于 2022-11-22  发布在  Ruby
关注(0)|答案(5)|浏览(171)

我是Ruby新手(也是一般的编程新手),我试图将数组转换为哈希,其中键是单词,值是单词在数组中出现的次数(例如“banana”=〉1,“mango”=〉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

但是代码根本不起作用。有人能给我解释一下为什么不起作用,我应该修改什么吗?
谢谢你,谢谢你

fv2wmkja

fv2wmkja1#

要使代码正常工作,您需要修改使用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)是一个哈希函数,当读取一个未知的键时,它返回0,所以你在这里要做的是通过迭代array并将每个键的计数加1来填充它。
我建议阅读更多关于reduce和each_with_object的内容,以了解它们的用法。
Fabio的回答更符合习惯,但我只是想说明如何修复代码,而不是重写代码。

idv4meu8

idv4meu82#

使用最新的ruby(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}
smtd7mpg

smtd7mpg3#

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

but5z9lq

but5z9lq4#

虽然您可以按照上面的注解来修复代码,但我希望提供以下替代方法:

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

yqyhoc1h5#

从Ruby 2.7开始就有了tally方法。下面是代码示例:

%w(banana pear mango kiwi mango).tally

输出:

{"banana"=>1, "pear"=>1, "mango"=>2, "kiwi"=>1}

相关问题