Проблема, на самом деле, заключается в том, что вы храните эти данные в виде массива строк.Это плохой выбор структуры данных, поскольку он значительно усложняет манипулирование.
Предположим, например, что сначала мы конвертируем эти данные в Hash
, который сопоставляет каждую страну со списком имен:
data = ['England John', 'England Ben', 'USA Paul', 'England John']
mapped_names = {}
data.each do |item|
country, name = item.split
mapped_names[country] ||= []
mapped_names[country] << name
end
Теперь получить счет довольно просто:
mapped_name_counts = unique_names.transform_values { |names| names.uniq.count }
Полученные переменные:
mapped_names # => {"England"=>["John", "Ben", "John"], "USA"=>["Paul"]}
mapped_name_counts # => {"England"=>2, "USA"=>1}
И если используется версия 2.7 ruby (еще не выпущена!!) эта последняя строка кода может быть даже упрощена до:
mapped_name_counts = unique_names.tally(&:uniq)