@dates

Как разбить данный массив?

Есть массив с датами, нужно их объединять, но не могу никак сделать это.

Пример:

Case 1, Input:
[
  {
    "from":"03/01/2021",
    "to":"03/06/2021"
  },
  {
    "from":"03/10/2021",
    "to":"03/15/2021"
  },
  {
    "from":"03/20/2021",
    "to":"03/25/2021"
  }
]


Output: Mar 1-6, 10-15, 20-25

Case 2, Input:
[
  {
    "from":"03/01/2021",
    "to":"03/05/2021"
  },
  {
    "from":"03/08/2021",
    "to":"03/10/2021"
  },
  {
    "from":"03/07/2021",
    "to":"03/20/2021"
  }
]


Output: Mar 1-5, 7-20
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Насколько я понимаю, вам нужно проверить все диапазоны на пересечения с другими диапазонами.

1. Берете первую пару дат, проверяете попадает ли from между какими-то другими парами from-to.

      a. Если попала - вы нашли пересечение. берете минимальное из обоих from, максимальное из обоих to, вносите в первый диапазон, удаляете тот совпавший, повторяете проверку пересечения.

      b. Потом то-же самое для даты to.

2. То-же самое с остальными оставшимися диапазонами.

В итоге у вас останутся только непересекающиеся, а их вы и так нормально выводите.
Ответ написан
Комментировать
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Все записи скиньте в один массив и отсортируйте по времени. Наверно имеет смысл распарсить даты в какой-нибудь тип Date, или как оно в js называется.

Потом пройдитесь по массиву, поддерживая счетчик открытых интервалов. Встретили "from" - увеличили счетчик. встретили "to" - уменьшили.

Если изменили счетчик с 0 на 1, то в текущей дате начало отрезка в ответе. Если изменили с 1 на 0, то тут конец.

Наверно, надо будет еще отрезки разбить по месяцам потом.

Еще надо разобраться с тем, когда даты совпадают. Если в одну и ту же дату есть to и from - это же должно считаться одним отрезком? Тогда при сортировке ставьте "from" перед "to" на одну и ту же дату (В сравнении при равенстве дат сравнивайте еще и тип события).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы