【问题标题】:Java - Search a List of Objects for a date between 2 datesJava - 在对象列表中搜索两个日期之间的日期
【发布时间】:2020-06-15 11:16:59
【问题描述】:

我有一个排序的对象列表(来自已排序):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 之间,则返回该行。 (地点、名称、从和到的组合是唯一的)

我的解决方案:

  1. 将属性列表从时间提取到列表
  2. 编写了自定义二分搜索实现:方法 LocalDateTime[] getFirstLastIndex(List fromTimes, LocalDateTime locationTime) 该方法返回locationTime的第一个和最后一个索引(对于重复值(From))
  3. 搜索列表 如果 firstIndex > listSize/2 firstIndex = firstIndex,LastIndex = listSize-1 如果firstIndex

我的问题:
有没有更好的解决方案?

【问题讨论】:

    标签: java algorithm collections binary-search


    【解决方案1】:

    由于您不需要在列表中保留重复项,我会尝试将其换成 TreeSetTreeMap,它们分别提供 subset(fromElement, toElement)submap(fromKey, toKey) 之类的方法 - 每个都有两种口味, 在 SortedSet/NavigableSet 和 SortedMap/NavigableMap 中声明,因此您可以根据需要控制 from 和两者是包含还是排除。

    这并不完全简单(但仍然值得追求),因为:

    • 使用 Set,您需要创建两个 LocationDetail 对象以在查询中用作“发件人”和“收件人”
    • 使用地图(由“from”值作为关键字),您需要处理多个位置详细信息具有相同“from”时间的情况。因此,您可能需要为每个“来自”值存储一些位置详细信息集合,并在返回的 submap(from, to).values().stream() 上执行一些 flatMap

    【讨论】:

    • 为家庭和办公室创建了 2 个列表。提取 Map>。这些是启动时的一次性操作。根据名称搜索。由于地图的搜索是 O(1)。
    • 感谢您提供不同的选项..了解一些好的功能..
    猜你喜欢
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2012-08-14
    • 2013-12-23
    • 2010-10-05
    • 2022-06-10
    相关资源
    最近更新 更多