Найти ближайший диапазон времени от текущей даты - PullRequest
1 голос
/ 20 мая 2019

У меня есть список объектов.Каждый из них содержит определенный диапазон времени «от» и «до».

Так, например:

import org.joda.time.DateTime

data class MyObject(
val from: String?,
val to: String?
)

asUtcDateTime() - это просто мой метод расширения, который преобразует данную строкуDateTime

Как найти ближайший объект, который:

  • не находится в сегодняшнем временном диапазоне
  • будет ближайшим от сегодняшнего дня (будущего или прошлого)?

То, что я до сих пор пробовал, это просто получить ближайший MyObject из прошлого и будущего, например:

    val now = DateTime.now()

     val nearestPastSchedule = allSchedules
        .sortedBy { it.to.asUtcDateTime() }
        .filter { it.to.asUtcDateTime() != null }
        .lastOrNull { it.to.asUtcDateTime()!!.millis < now.withTimeAtStartOfDay().millis }

    val nearestFutureSchedule = allSchedules
        .sortedBy { it.from.asUtcDateTime() }
        .filter { it.from.asUtcDateTime() != null }
        .lastOrNull { it.from.asUtcDateTime()!!.millis > now.withTimeAtStartOfDay().millis }

Не знаю, что было бы хорошим решением с точки зрениясравнивая их (считая, что их можно обнулять), а также возвращая фактический MyObject для каждого из них

1 Ответ

1 голос
/ 20 мая 2019

Вместо сортировки вы можете найти указанный элемент самостоятельно. Я делаю это, находя абсолютную минимальную разницу между временем и временем, указанным в объекте.

Для простоты я настроил класс данных для использования ZonedDateTime (при условии, что Java> = 8 будет доступна):

    data class MyObject(
            val from: ZonedDateTime?,
            val to: ZonedDateTime?
    )

При этом вы можете отфильтровать и найти минимальное абсолютное значение между настоящим моментом и соответствующим временем:

val nearestPastSchedule = 
    allSchedules.filter { it.to != null }
                .minBy { abs(it.to!!.toInstant().toEpochMilli() - now) }
val nearestFutureSchedule =
    allSchedules.filter { it.from != null }
                .minBy { abs(it.from!!.toInstant().toEpochMilli() - now) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...