details.map { |h| h[:name] }.
group_by(&:itself).
values.
sort_by { |a| -a.size }.
flatten
#=> ["Ted", "Ted", "Ted", "Amy", "Amy", "Alice", "Poppy"]
Можно добавить .join(', ')
, если вместо этого требуется строка:
"Ted, Ted, Ted, Amy, Amy, Alice, Poppy"
Самая дорогая операция здесь - это сортировка, которая является O (n * log (n)); все остальные операции O (n). Пусть
arr = ["Alice", "Ted", "Poppy", "Amy", "Ted", "Amy", "Ted"]
Выполняя group_by
и values
до sort_by
, только
n = arr.uniq.size
#=> 4
значения должны быть отсортированы, в отличие от сортировки всех 7 элементов arr
.
Шаги следующие.
b = details.map { |h| h[:name] }
#=> ["Alice", "Ted", "Poppy", "Amy", "Ted", "Amy", "Ted"]
c = b.group_by(&:itself)
#=> {"Alice"=>["Alice"], "Ted"=>["Ted", "Ted", "Ted"], "Poppy"=>["Poppy"],
# "Amy"=>["Amy", "Amy"]}
d = c.values
#=> [["Alice"], ["Ted", "Ted", "Ted"], ["Poppy"], ["Amy", "Amy"]]
e = d.sort_by { |a| -a.size }
#=> [["Ted", "Ted", "Ted"], ["Amy", "Amy"], ["Alice"], ["Poppy"]]
e.flatten
#=> ["Ted", "Ted", "Ted", "Amy", "Amy", "Alice", "Poppy"]