У меня есть многомерный массив, аналогичный приведенному ниже примеру, который я хочу сгруппировать, используя метод zip в Ruby.У меня это работает нормально, когда каждый внутренний массив имеет одинаковое количество элементов, но сталкиваюсь с проблемами, когда они имеют разную длину.
В приведенном ниже примере во втором наборе отсутствует запись в 00:15. Как бы я заполнил эту пропущенную запись?
Что я рассматриваю пробел?
Это отметка времени, которая составляет пробел,Взгляните на мой первый пример кода, где у меня есть комментарий о пробеле в 00:15.Все другие массивы имеют хэш с этой отметкой времени, поэтому я считаю, что это «отсутствующая запись» или «пробел».Отметка времени действительно может быть какой-то другой уникальной строкой, поэтому тот факт, что они находятся на расстоянии 15 минут, не имеет значения.Значения также не имеют значения.
Единственный подход, который приходит на ум, заключается в повторении циклов над массивами дважды.Первый раз - создать массив уникальных временных меток, а второй - заполнить пропущенные записи, в которых временной метки нет.Мне удобно кодировать этот подход, но он кажется немного странным, и Руби всегда удивляет меня элегантным и лаконичным решением.
Я начинаю с этого:
values = [
[
{:timestamp => "2011-01-01 00:00", :value => 1},
{:timestamp => "2011-01-01 00:15", :value => 2},
{:timestamp => "2011-01-01 00:30", :value => 3}
],
[ # There's a gap here at 00:15
{:timestamp => "2011-01-01 00:00", :value => 1},
{:timestamp => "2011-01-01 00:30", :value => 3}
],
[
{:timestamp => "2011-01-01 00:00", :value => 1},
{:timestamp => "2011-01-01 00:15", :value => 2},
{:timestamp => "2011-01-01 00:30", :value => 3}
]
]
Я хочув итоге:
values = [
[
{:timestamp => "2011-01-01 00:00", :value => 1},
{:timestamp => "2011-01-01 00:15", :value => 2},
{:timestamp => "2011-01-01 00:30", :value => 3}
],
[ # The gap has been filled with a nil value
{:timestamp => "2011-01-01 00:00", :value => 1},
{:timestamp => "2011-01-01 00:15", :value => nil},
{:timestamp => "2011-01-01 00:30", :value => 3}
],
[
{:timestamp => "2011-01-01 00:00", :value => 1},
{:timestamp => "2011-01-01 00:15", :value => 2},
{:timestamp => "2011-01-01 00:30", :value => 3}
]
]
Когда все массивы имеют одинаковый размер, values.transpose
выдаст:
[
[
{:value=>1, :timestamp=>"2011-01-01 00:00"},
{:value=>1, :timestamp=>"2011-01-01 00:00"},
{:value=>1, :timestamp=>"2011-01-01 00:00"}
],
[
{:value=>2, :timestamp=>"2011-01-01 00:15"},
{:value=>nil, :timestamp=>"2011-01-01 00:15"},
{:value=>2, :timestamp=>"2011-01-01 00:15"}
],
[
{:value=>3, :timestamp=>"2011-01-01 00:30"},
{:value=>3, :timestamp=>"2011-01-01 00:30"},
{:value=>3, :timestamp=>"2011-01-01 00:30"}
]
]