escribió el enfoque imperativo común y probablemente es la implementación más rápida en Ruby. Con un poco de refactorización, puede escribir una sola línea:
wf = Hash.new(0).tap { |h| words.each { |word| h[word] += 1 } }
Otro enfoque imperativo el uso de Enumerable#each_with_object
:
wf = words.each_with_object(Hash.new(0)) { |word, acc| acc[word] += 1 }
Un enfoque funcional utilizando abstracciones existentes:
wf = words.group_by { |w| w }.map { |w, ws| [w, ws.length] }.to_h
Tenga en cuenta que esto sigue siendo O (n) en el tiempo, pero atraviesa la colección tres veces y crea dos objetos intermedios a lo largo del camino.
Finalmente: el contador de frecuencia/histograma es una abstracción común que encontrará en algunas bibliotecas como Facets: Enumerable#frequency.
require 'facets'
wf = words.frequency
¿Estás haciendo el curso SaaS de Berkeley? – Gordon
Sí, tengo una solución, pero estoy buscando las mejores versiones. – demas
si 'result [word]' no existe arrojará una excepción porque no hay '+' para nil. –