How to count duplicate elements in a Ruby array
You can do this very succinctly (one line) by using inject
:
a = ['FATAL <error title="Request timed out.">',
'FATAL <error title="Request timed out.">',
'FATAL <error title="There is insufficient ...">']
b = a.inject(Hash.new(0)) {|h,i| h[i] += 1; h }
b.to_a.each {|error,count| puts "#{count}: #{error}" }
Will produce:
1: FATAL <error title="There is insufficient ...">
2: FATAL <error title="Request timed out.">
If you have array like this:
words = ["aa","bb","cc","bb","bb","cc"]
where you need to count duplicate elements, a one line solution is:
result = words.each_with_object(Hash.new(0)) { |word,counts| counts[word] += 1 }
The following code prints what you asked for. I'll let you decide on how to actually use to generate the hash you are looking for:
# sample array
a=["aa","bb","cc","bb","bb","cc"]
# make the hash default to 0 so that += will work correctly
b = Hash.new(0)
# iterate over the array, counting duplicate entries
a.each do |v|
b[v] += 1
end
b.each do |k, v|
puts "#{k} appears #{v} times"
end
Note: I just noticed you said the array is already sorted. The above code does not require sorting. Using that property may produce faster code.