我有一个单词数组,我想得到一个散列,其中键是单词,值是单词计数.
有没有比我更美的方式:
result = Hash.new(0)
words.each { |word| result[word] += 1 }
return result
我有一个单词数组,我想得到一个散列,其中键是单词,值是单词计数.
有没有比我更美的方式:
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