Ios 快速遍历日期间隔数组

Ios 快速遍历日期间隔数组,ios,arrays,swift,dateinterval,Ios,Arrays,Swift,Dateinterval,在我的iOS应用程序中,我有一个事件列表,每个事件都有开始和结束日期。我的目标是找出哪些事件相互重叠——也就是说,如果事件1从10月6日星期一下午2:30开始,到5:30结束,而事件4从10月6日星期一下午3:30开始。我需要知道这两件事是重叠的 因此,当从web下载数据时,我创建了一个数组[DateInterval],其中每个EventObjects分别包含开始日期和结束日期 我的问题是,迭代eventObjects数组,然后检查开始日期是否与[DateInterval]日期相交的最佳方法是什

在我的iOS应用程序中,我有一个事件列表,每个事件都有开始和结束日期。我的目标是找出哪些事件相互重叠——也就是说,如果事件1从10月6日星期一下午2:30开始,到5:30结束,而事件4从10月6日星期一下午3:30开始。我需要知道这两件事是重叠的

因此,当从web下载数据时,我创建了一个数组
[DateInterval]
,其中每个
EventObjects
分别包含开始日期和结束日期

我的问题是,迭代eventObjects数组,然后检查开始日期是否与
[DateInterval]
日期相交的最佳方法是什么

先谢谢你

编辑

下面是一个示例代码

func sortArray (){

  for object in sortedEventObjectArray {


        let hasConflics = zip(datesReversed, datesReversed.dropFirst()).contains(where: { $0.end > $1.start })

        if hasConflics == true {
            print("conflict")
        } else {
            print("none")
        }

    }
}

[sortedEventObjectArray] is an event object which contains details like the start date and end date of event - this is what i used to populate the datesReserved array of Date Intervals

[datesReversed] is an array of DateIntervals - it looks like this

[2018-11-01 06:00:00 +0000 to 2018-11-01 09:30:00 +0000, 2018-11-01 18:00:00 +0000 to 2018-11-01 19:33:00 +0000, 2018-11-01 19:33:00 +0000 to 2018-11-01 23:00:00 +0000, 2018-11-03 18:14:00 +0000 to 2018-11-03 21:44:00 +0000, 2018-11-03 18:14:00 +0000 to 2018-11-03 21:44:00 +0000, 2018-11-06 12:00:00 +0000 to 2018-11-06 13:26:00 +0000, 2018-11-06 13:27:00 +0000 to 2018-11-06 14:00:00 +0000, 2018-11-06 17:00:00 +0000 to 2018-11-06 22:00:00 +0000, 2018-11-06 18:00:00 +0000 to 2018-11-06 21:00:00 +0000, 2018-11-07 12:00:00 +0000 to 2018-11-07 14:30:00 +0000, 2018-11-07 18:30:00 +0000 to 2018-11-07 23:00:00 +0000, 2018-11-08 11:30:00 +0000 to 2018-11-08 12:59:00 +0000, 2018-11-08 12:56:00 +0000 to 2018-11-08 13:30:00 +0000, 2018-11-08 19:30:00 +0000 to 2018-11-08 22:30:00 +0000, 2018-11-09 12:30:00 +0000 to 2018-11-09 14:30:00 +0000, 2018-11-09 15:00:00 +0000 to 2018-11-09 16:00:00 +0000, 2018-11-09 16:30:00 +0000 to 2018-11-09 21:00:00 +0000, 2018-11-09 20:00:00 +0000 to 2018-11-09 21:30:00 +0000, 2018-11-10 12:30:00 +0000 to 2018-11-10 20:30:00 +0000, 2018-11-10 13:45:00 +0000 to 2018-11-10 14:30:00 +0000, 2018-11-10 18:00:00 +0000 to 2018-11-10 19:00:00 +0000]
我得到的结果是-(这是错误的,因为很明显,其中一些日期没有计划冲突)


一个有效的解决方案是通过先增加开始日期对事件进行排序。然后,您只需将每个事件与稍后开始的事件进行比较

如果模型对象是

struct Event {
    let title: String
    let duration: DateInterval
}
然后它可能看起来像这样(未经测试):


您可以扩展
DateInterval
以检查重叠事件

我们可以将其分解为3个验证来检查: (假设已设置eventA事件,并且您正在使用eventB对其进行检查)

  • 检查在eventB之后启动的eventB是否在eventA结束之前启动和结束
  • 检查eventB是否在eventA开始之后和eventA结束之前结束
  • 检查eventB是否在eventA开始之前开始,在eventA结束之后结束
  • 检查事件A和事件B是否同时启动
  • 鉴于此,我认为这个解决方案可以做到:

    扩展日期间隔{
    func isOverlaps(带di:DateInterval)->Bool{
    让我回答=
    checkIfDitartTheSameTime(日期间隔:di)||
    检查中间(日期:di.start)||
    检查中间(日期:di.end)||
    CheckIfDistartsBeforeEndsAfter(日期间隔:di)
    回覆
    }
    私有函数checkIfDIIsBetween(日期:date)->Bool{
    返回日期>开始日期<结束日期==开始日期
    }
    私有函数checkIfDistartsBeforeEndsAfter(日期间隔:日期间隔)->Bool{
    return dateInterval.startend
    }
    私有函数checkIfDItartAtTheSameTime(dateInterval:dateInterval)->Bool{
    return dateInterval.start==start
    }
    
    }
    @MartinR你能试试我们之前对话中的伪代码吗?谢谢你的回复!我相信第二个是最好的选择。我现在正试图实现这个功能。我相信它必须在某种类型的循环中,尽管它要遍历整个数组,对吗?@codingwhileload:
    zip(events,events.dropFirst())
    “神奇地”遍历所有相邻数组元素对。嘿@MartinR我在我的帖子中添加了一些示例代码。希望你能指出我的错误。。thanks@CodingwhileLoading:第二个(zip)解决方案仅用于确定是否存在冲突,在循环中这样做没有意义我建议试试我的第一个解决方案。哦,我明白你的意思!我会尝试嵌套循环,但我正在尝试在2上获得更好的性能。请注意,
    DateInterval
    已经有了一个方法–无需重新发明轮子:)
    struct Event {
        let title: String
        let duration: DateInterval
    }
    
    var events: [Event] = ...
    events.sort(by: { $0.duration.start < $1.duration.start })
    for i in events.indices.dropLast() {
        for j in (i + 1)..<events.endIndex {
            if events[i].duration.end > events[j].duration.start {
                print(events[i].title, "overlaps with", events[j].title)
            } else {
                break
            }
        }
    }
    
    var events: [Event] = ...
    events.sort(by: { $0.duration.start < $1.duration.start })
    var hasConflicts = false
    for i in events.indices.dropLast() {
        if events[i].duration.end > events[i+1].duration.start {
            hasConflics = true
            break
        }
    }
    
    var events: [Event] = ...
    events.sort(by: { $0.duration.start < $1.duration.start })
    let hasConflics = zip(events, events.dropFirst())
        .contains(where: { $0.duration.end > $1.duration.start })