Подтвердить что ты не робот

Ruby - Уникальные элементы в массиве

У меня есть массив с некоторыми элементами. Как я могу получить видимость каждого элемента в массиве?

Пример:

Дано:

a = ['cat', 'dog', 'fish', 'fish']

Результат:

a2 #=> {'cat' => 1, 'dog' => 1, 'fish' => 2}

Как я могу это сделать?

4b9b3361

Ответ 1

Вы можете использовать Enumerable#group_by для этого

res = Hash[a.group_by {|x| x}.map {|k,v| [k,v.count]}]
#=> {"cat"=>1, "dog"=>1, "fish"=>2}

Ответ 2

a2 = a.reduce(Hash.new(0)) { |a, b| a[b] += 1; a }
#=> {"cat"=>1, "fish"=>2, "dog"=>1}

Ответ 3

a2 = {}
a.uniq.each{|e| a2[e]= a.count(e)}

Ответ 4

В 1.9.2 вы можете сделать это так, по моему опыту, довольно много людей находят each_with_object более читабельными, чем reduce/inject (те, кто знает об этом как минимум):

a = ['cat','dog','fish','fish']
#=> ["cat", "dog", "fish", "fish"]

a2 = a.each_with_object(Hash.new(0)) { |animal, hash| hash[animal] += 1 }
#=> {"cat"=>1, "dog"=>1, "fish"=>2}

Ответ 5

m = {}

a.each do |e|
  m[e] = 0 if m[e].nil?
  m[e] = m[e] + 1
end

puts m

Ответ 6

Используйте метод count array, чтобы получить счет.

a.count('cat')

Ответ 7

a.inject({}){|h, e| h[e] = h[e].to_i+1; h }
#=> {"cat"=>1, "fish"=>2, "dog"=>1}

или n2-решение

a.uniq.inject({}){|h, e| h[e] = a.count(e); h }
#=> {"cat"=>1, "fish"=>2, "dog"=>1}

Ответ 8

a = ['cat','dog','fish','fish']
a2 = Hash[a.uniq.map {|i| [i, a.count(i)]}]

Ответ 9

a = ['cat','dog','fish','fish']
a2 = Hash.new(0)
a.each do |e|
    a2[e] += 1
end
a2

Ответ 10

ruby ​​fu!

count = Hash[Hash[rows.group_by{|x| x}.map {|k,v| [k, v.count]}].sort_by{|k,v| v}.reverse]