2016-05-26 2 views
-3

У меня есть следующая определенная таблица. Индекс для каждого элемента в каждой строке соответствует одному и тому же полю.Как суммировать несколько элементов вложенных массивов по уникальным ключам

[[123.0, 23,"id1",34, "abc"], 
[234.1,43, "id2", 24,"jsk"], 
[423.5,53, "id1",1,"xyz"], 
[1.4, 5, "id2",0,"klm"]] 

В приведенном выше примере мне нужно, чтобы сгруппировать и суммировать выходной сигнал, который суммирует каждый из суммируемых элементов по индексу для уникального идентификатора в 3-м столбце. Результат должен выглядеть так:

[[546.5,76, "id1",35], 
[235.5,48, "id2",24]] 

Каков наилучший способ для этого?

+0

Если вы можете показать, как вы это сделали, то другие могут прокомментировать, как его улучшить. Обратите внимание, что если вам нужен ваш код для проверки, возможно, вам придется опубликовать его в [Обмен отзывами кода] (http://codereview.stackexchange.com) –

ответ

1

Это по существу то же самое, что решение для вашего previous question.

data = [ [ 123.0, 23, "id1", 34, "abc" ], 
     [ 234.1, 43, "id2", 24, "jsk" ], 
     [ 423.5, 53, "id1", 1, "xyz" ], 
     [ 1.4, 5, "id2", 0, "klm" ] ] 

sums = Hash.new {|h,k| h[k] = [0, 0, 0] } 

data.each_with_object(sums) do |(val0, val1, id, val2, _), sums| 
    sums[id][0] += val0 
    sums[id][1] += val1 
    sums[id][2] += val2 
end 
# => { "id1" => [ 546.5, 76, 35 ], 
#  "id2" => [ 235.5, 48, 24 ] } 

Основное различие заключается в том, что вместо того, чтобы давать хеш-значение по умолчанию 0, мы даем ему прок по умолчанию, который инициализирует недостающие ключи с [0, 0, 0]. (Мы не можем просто делать Hash.new([0, 0, 0]), потому что тогда каждое значение будет ссылкой на один экземпляр Array, а не на каждое значение, имеющее свой собственный массив). Затем внутри блока мы добавляем каждое значение (val0 и др.) К соответствующему элементы sums[id].

Если вы хотите массив Массивы вместо хеша с id с индексом 2, то в конце концов, вы бы добавить что-то вроде этого:

.map {|id, vals| vals.insert(2, id) } 

Однако хэша с идентификаторами поскольку ключи имеют больше смысла в качестве структуры данных.

+0

Извините, произвел обновление к проблеме – locoboy

+0

Я вижу, что вы однако, это имеет смысл, поскольку я действительно не понимаю концепцию '.each_with_object' – locoboy

+0

Я отредактировал свой ответ, чтобы отразить ваши изменения. –

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