我有一些对象清单。它们每个都包含指定的特定“开始”和“结束”时间范围。
例如:
import org.joda.time.DateTime
data class MyObject(
val from: String?,
val to: String?
)
asUtcDateTime()
只是我的扩展方法,它将给定的String转换为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
答案 0 :(得分:1)
您可以自己查找指定的元素,而不是进行排序。为此,我找到了现在与对象中指定的时间之间的绝对最小差。
出于简单原因,我将数据类调整为使用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) }