Предположим,
arr = [4, 1, 3, 4, 2, 5, 1, 3, 4, 3, 4]
Вы можете использовать форму Hash :: new , которая принимает аргумент, называемый значением по умолчанию (что часто, как здесь, равен нулю), чтобы получить частоту элементов arr
:
freq = arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }
#=> {4=>4, 1=>2, 3=>3, 2=>1, 5=>1}
Мы видим, что
freq[1]
#=> 2
freq[99]
#=> 0
Второй результат следует из того, что freq
было определено, чтобы иметьзначение по умолчанию 0
.Все это означает, что если freq
не имеет ключа k
, freq[k]
возвращает ноль (и это не меняет freq
).
Вот решения для двух возможных интерпретаций вашего вопроса,Оба используют метод Enumerable # sort_by .
Сортировка уникальных значений arr
по уменьшению частоты
freq.sort_by { |_,v| -v }.map(&:first)
#=> [4, 3, 1, 2, 5]
Сортировказначения arr
путем уменьшения частоты
arr.sort_by { |n| -freq[n] }
#=> [4, 4, 4, 4, 3, 3, 3, 1, 1, 2, 5]
Замените -v
и -freq[n]
на v
и freq[n]
для сортировки по возрастанию частоты.
IИспользовал локальную переменную _
для представления ключей в первой интерпретации, чтобы показать, что она не используется в расчете блока.Это обычная практика.