#ruby #arrays #sorting
#ruby #массивы #сортировка
Вопрос:
У меня есть массив массивов
[
[3, "2014-06-28"],
[3, "2014-06-29"],
[3, "2014-06-30"],
[27, "2014-07-02"],
[7, "2014-07-02"]
]
Если даты равны, я хочу получить среднее значение их значений, чтобы приведенный выше массив стал
[
[3, "2014-06-28"],
[3, "2014-06-29"],
[3, "2014-06-30"],
[17, "2014-07-02"],
]
Массив уже отсортирован по дате.
Как бы я поступил по этому поводу? Использую ли я рекурсивную функцию?
Комментарии:
1. хорошо, вы хотите среднее значение второго столбца, где даты одинаковы? верно?
2. А как насчет первого столбца? Должно ли оно быть тоже средним?
3. Я отредактировал вопрос для ясности
4. Отсортирован ли ваш массив по дате по умолчанию? 🙂
5. да, он отсортирован по дате
Ответ №1:
arr = [
[3, "2014-06-28"],
[3, "2014-06-29"],
[3, "2014-06-30"],
[27, "2014-07-02"],
[7, "2014-07-02"]
]
arr.group_by(amp;:last).map do |k, vs|
av = vs.map(amp;:first).inject(: ) / vs.size.to_f
[av, k]
end
#=> [
#=> [3.0, "2014-06-28"],
#=> [3.0, "2014-06-29"],
#=> [3.0, "2014-06-30"],
#=> [17.0, "2014-07-02"]
#=> ]
Если вы ищете более оптимизированное, но менее идиоматичное решение (и ваш набор данных упорядочен по дате), вы могли бы следовать этому:
arr = [
[3, "2014-06-28"],
[3, "2014-06-29"],
[3, "2014-06-30"],
[27, "2014-07-02"],
[7, "2014-07-02"]
]
res = []
tmp = [0]
cnt = 0
arr.each do |num, date|
if tmp[1] amp;amp; tmp[1] != date
tmp[0] /= cnt.to_f
res << tmp
tmp = [0]
cnt = 0
end
tmp[0] = num
tmp[1] = date
cnt = 1
end
tmp[0] /= cnt.to_f
res << tmp
res
#=> [
#=> [3.0, "2014-06-28"],
#=> [3.0, "2014-06-29"],
#=> [3.0, "2014-06-30"],
#=> [17.0, "2014-07-02"]
#=> ]
Комментарии:
1. Если бы у меня было дополнительное значение в каждом массиве, скажем, например
[1400496920000, 2, "2014-05-19"]
. Как бы мне отредактировать ваш второй пример, чтобы усреднить второе значение в массиве?2. Каким должен быть результат? Массив массивов из двух элементов или трех элементов?