Ruby - Уникальные элементы в массиве У меня есть массив с некоторыми элементами. Как я могу получить видимость каждого элемента в массиве? Пример: Дано: a = ['cat', 'dog', 'fish', 'fish'] Результат: a2 #=> {'cat' => 1, 'dog' => 1, 'fish' => 2} Как я могу это сделать? Ответ 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]
Ответ 1 Вы можете использовать Enumerable#group_by для этого res = Hash[a.group_by {|x| x}.map {|k,v| [k,v.count]}] #=> {"cat"=>1, "dog"=>1, "fish"=>2}
Ответ 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}
Ответ 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}
Ответ 10 ruby fu! count = Hash[Hash[rows.group_by{|x| x}.map {|k,v| [k, v.count]}].sort_by{|k,v| v}.reverse]