我有一个单词数组,我想得到一个散列,其中键是单词,值是单词计数.

有没有比我更美的方式:

result = Hash.new(0)
words.each { |word| result[word] += 1 }
return result

推荐答案

您使用的命令式方法可能是Ruby中最快的实现.通过一些重构,您可以编写一行代码:

wf = Hash.new(0).tap { |h| words.each { |word| h[word] += 1 } }

使用Enumerable#each_with_object的另一个必要方法:

wf = words.each_with_object(Hash.new(0)) { |word, acc| acc[word] += 1 }

使用现有抽象的功能/不变方法:

wf = words.group_by(&:itself).map { |w, ws| [w, ws.length] }.to_h

请注意,这在时间上仍然是O(n),但它会遍历集合三次,并在此过程中创建两个中间对象.

最后:频率计数器/直方图是一种常见的抽象,在Facets:Enumerable#frequency等库中可以找到.

require 'facets'
wf = words.frequency

Ruby相关问答推荐

如何使用 HEREDOC 作为参数传递给方法?

有没有一种简单的方法可以在 Ruby 中获取图像尺寸?

Ruby 中的yield关键字有什么作用?

如何在新行之间拆分字符串并保留空白行?

Ruby:拆分,然后删除前导/尾随空格?

在Ruby中将关键字与常规参数混合?

什么是 Sinatra/Rack 的非常简单的身份验证方案

Ruby语法

如何找到安装 Ruby Gem 的路径(即 Gem.lib_path c.f. Gem.bin_path)

如何在控制台中禁用 MongoDB 日志(log)消息?

Puppet/Facter无法检索事实 fqdn:如何修复或规避?

Ruby 'require' 语句是在类定义的内部还是外部?

Ruby 的所有/最佳列表?

在 OSX 10.10 Yosemite 上安装 Nokogiri

如何在 ruby​​ 中进行命名捕获

Ruby Style:如何判断嵌套的哈希元素是否存在

如何重命名 gemset?

以小时为单位的时差

将哈希传递给函数 ( *args ) 及其含义

查找两个数组的共同点