Ios 快速遍历日期间隔数组
在我的iOS应用程序中,我有一个事件列表,每个事件都有开始和结束日期。我的目标是找出哪些事件相互重叠——也就是说,如果事件1从10月6日星期一下午2:30开始,到5:30结束,而事件4从10月6日星期一下午3:30开始。我需要知道这两件事是重叠的 因此,当从web下载数据时,我创建了一个数组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]日期相交的最佳方法是什
[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对其进行检查)
扩展日期间隔{
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 })