我有一个排序的对象列表(来自已排序):List LocationDetail
---------------------------------------------------------------------------------------------
| id | Place | Name | From | To | Address
---------------------------------------------------------------------------------------------
| 2 | Office | Mark | 2020-06-02 08:00:00 | 2020-06-02 19:59:59 | Office_Address |
| 4 | Office | John | 2020-06-02 08:00:00 | 2020-06-02 19:59:59 | Office_Address |
| 1 | Home | Mark | 2020-06-01 20:00:00 | 2020-06-02 07:59:59 | Home_Address |
| 3 | Home | John | 2020-06-01 20:00:00 | 2020-06-02 07:59:59 | Home_Address |
---------------------------------------------------------------------------------------------
我想搜索以下内容的详细信息:
地点、名称、位置时间
如果 locationTime 介于 From 和 To 之间,则返回该行。 (地点、名称、从和到的组合是唯一的)
我的解决方案:
- 将属性 From 列表提取到 fromTimes 列表
- 编写了一个自定义二分搜索实现:方法 LocalDateTime[] getFirstLastIndex(List fromTimes, LocalDateTime locationTime) 此方法返回 locationTime 的第一个和最后一个索引(对于重复值(From))
- 搜索列表
如果firstIndex>listSize/2firstIndex=firstIndex,LastIndex=listSize-1
如果firstIndex
我的问题:
有更好的解决办法吗?
最佳答案
由于您不需要在列表中保留重复项,因此我会尝试将其换成 TreeSet
或 TreeMap
,它们提供诸如 之类的方法submap(fromElement, toElement)
和 submap(fromKey, toKey)
分别 - 各有两种风格,在 SortedSet/NavigableSet 和 SortedMap/NavigableMap 中声明,因此您可以根据需要控制是否from 和two 是包含的或排除的。
这并不完全简单(但仍然值得追求),因为:
- 对于 Set,您需要创建两个
LocationDetail
对象以在查询中用作“from”和“to” - 使用 map (以“起始”值作为键),您需要处理多个位置详细信息具有相同“起始”时间的情况。因此,您可能需要为每个“from”值存储一些位置详细信息的集合,并对返回的
submap(from, to).values().stream()< 执行一些
flatMap
/
关于Java - 在对象列表中搜索 2 个日期之间的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62378534/