Попробуйте это.
t1 = "This is a really really really cool cool cool"
Шаг 1: разбить строку на массив слов
words = t1.split
#=> ["This", "is", "a", "really", "really", "really", "cool", "cool", "cool"]
Шаг 2: Вычислите ваш хэш частоты
frequency = Hash.new(0)
words.each { |word| frequency[word.downcase] += 1 }
frequency
##=> {"this"=>1, "is"=>1, "a"=>1, "really"=>3, "cool"=>3}
Шаг 3: Определить максимальную частоту
arr = frequency.max_by { |k, v| v }
#=> ["really", 3]
max_frequency = arr.last
#=> 3
Шаг 4: Создать массив, содержащий слова с частотой max_frequency
arr = frequency.select { |k, v| v == max_frequency }
#=> {"really"=>3, "cool"=>3}
arr.map { |k, v| k }
#=> ["really", "cool"]
Обычный способ написать это на Ruby
words = t1.split
#=> ["This", "is", "a", "really", "really", "really", "cool", "cool", "cool"]
frequency = words.each_with_object(Hash.new(0)) do |word, f|
f[word.downcase] += 1
end
#=> {"this"=>1, "is"=>1, "a"=>1, "really"=>3, "cool"=>3}
max_frequency = frequency.max_by(&:last).last
#=> 3
frequency.select { |k, v| v == max_frequency }.map(&:first)
#=> ["really", "cool"]
Примечания
e = [1,2,3].map #=> #<Enumerator: [1, 2, 3]:map>
. Это говорит нам о том, что frequency.map.max_by { |k,v| v }
совпадает с frequency.max_by { |k,v| v }
.
- В
frequency = frequency.map.max_by {|k, v| v }
, frequency
справа - хеш; frequency
слева - массив. Обычно считается плохой практикой повторное использование переменных таким образом.
- Часто
frequency.max_by { |k,v| v }
записывается frequency.max_by { |_,v| v }
или frequency.max_by { |_k,v| v }
, главным образом, чтобы сообщить читателю, что первая переменная блока не используется в расчете блока. (Как я указывал выше, это утверждение обычно пишется frequency.max_by(&:last)
.) Примечание _
- допустимая локальная переменная.
frequency.max_by { |k, v| v }.last
можно вместо этого записать frequency.map { |k, v| v }.max
, но это имеет тот недостаток, что map
создает промежуточный массив из frequence.size
элементов, тогда как первый создает промежуточный массив из двух элементов.