Вычисление Ruby-массива с группировкой связанных и не связанных элементов - PullRequest
0 голосов
/ 25 февраля 2019

Я делаю некоторые вычисления даты и времени, когда мне нужно вычислить новую группу часов на основе массива упорядоченных хешей времени и даты.Например, если это исходный массив (я упростил значения, но он сопоставим):

[
  {first: 9,     last: 9.30},
  {first: 9.30,  last: 10},
  {first: 10,    last: 10.30},
  {first: 12.30, last: 13},
  {first: 14,    last: 14.30},
  {first: 14.30, last: 16.30},
  {first: 16.30, last: 18.30},
]

результат должен быть

[
  {first: 9,     last: 10.30},
  {first: 12.30, last: 13},
  {first: 14,    last: 18.30}
]

Он также должен работать в других случаях, когда первый /последний не подключен или когда есть несколько групп.

Мое решение с each_cons(2), где я проверяю группы на 2, но это не работает для некоторых крайних случаев.

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Это задание для Enumerable # slice_when , массив должен быть отсортирован.

array.slice_when { |a, b| a[:last] != b[:first] }.map{ |e| {first: e.first[:first], last: e.last[:last]} }
#=> [{:first=>9, :last=>10.3}, {:first=>12.3, :last=>13}, {:first=>14, :last=>18.3}]


Enumerable #chunk_ while делает то же самое:
array.chunk_while { |a, b| a[:last] == b[:first] }
0 голосов
/ 25 февраля 2019

Это работает для вашего случая, когда диапазоны сортируются по first:

new_ranges = ranges.each_with_object([]) do |range, new_ranges|
  if new_ranges.empty? || new_ranges.last[:last] < range[:first]
    new_ranges << range
  elsif new_ranges.last[:last] < range[:last]
    new_ranges.last[:last] = range[:last]
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...