2012-10-16 3 views
0

У меня есть Ruby 2D Array, где каждый массив имеет строку из SQL-запроса и его столбцы внутри подмассива.Получение уникальных значений и их счет в двухмерном массиве ruby ​​

@mastertest = connection.execute("select code_ver from mastertest") 

, которые могли бы содержать что-то вроде этого:

@mastertest = [{"abc"} , {"abc"}, {"pqr"}, {"xyz"}, {"pqr"}, {"pqr"}] 

Теперь я хочу, чтобы сформировать другой 2D массив, который дал бы мне только те строки, которые имеют уникальное значение code_ver с их счета.

Что-то вроде этого:

@result = [{"abc", 2} , {"xyz", 1} , {"pqr", 3}] 
+3

Те не действительные объекты Ruby. – sawa

+0

Этот вопрос довольно запутанный ... не могли бы вы лучше объяснить? –

ответ

3
@result = @mastertest.inject(Hash.new(0)) { |hash,element| 
    hash[element] +=1 
    hash 
} 
+0

спасибо много! отлично работает –

2

Как сказал Савва, ваши данные не являются действительными объектами Ruby. Я предполагаю, что вы имели в виду:

@mastertest = ["abc" , "abc", "pqr", "xyz", "pqr", "pqr"] 
@result = @mastertest.inject({}) do |a, e| 
    a[e] ||= 0 
    a[e] += 1 
    a 
end.to_a 
#=> [["xyz", 1], ["abc", 2], ["pqr", 3]] 
3

Я думаю each_with_object это лучший способ:

["abc" , "abc", "pqr", "xyz", "pqr", "pqr"].each_with_object({}) do |e, o| 
    o[e] ||= 0 
    o[e] += 1 
end.to_a 
#=> [["xyz", 1], ["abc", 2], ["pqr", 3]] 
+0

Почему бы «each_with_object» лучше? – oldergod

+0

Это больше природы, менее склонны к ошибкам, и меньше кода. http://www.themomorohoax.com/2009/01/03/rails-each-with-object-vs-inject – Van

+0

Вы говорите мне, что лучше по какой-то причине вы даже не используете, так как вы возвращаете массив в конце цикла, пока вам не нужно? – oldergod

Смежные вопросы