Swift中解析无命名JSON数组及事件排序、重叠检测咨询
Swift解析无命名JSON数组、排序事件及检测重叠指南
嘿,作为Swift新手,处理这种无命名的JSON数组确实需要点小技巧,我来一步步帮你搞定所有需求!
第一步:解析无命名JSON数组和对象
首先,我们可以利用Swift的Codable协议来轻松解析JSON,这比手动解析要高效得多。
1. 定义事件模型
先创建一个符合Codable的Event结构体,对应JSON里的每个对象:
struct Event: Codable { let title: String let start: Date let end: Date }
这里直接把start和end定义成Date类型,后续排序和重叠检测会更方便,但需要处理自定义的日期格式。
2. 配置日期解码器
你的JSON里的日期格式是"November 10, 2018 6:00 PM"这种,Swift默认的日期解码器不支持,所以我们要自定义一个DateFormatter:
let dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "MMMM dd, yyyy h:mm a" formatter.locale = Locale(identifier: "en_US_POSIX") // 确保解析英文月份不受系统区域影响 return formatter }()
3. 执行解析
接下来就可以用JSONDecoder来解析无命名数组了,直接把JSON数据解码成[Event]类型:
// 假设你的JSON字符串是jsonString guard let jsonData = jsonString.data(using: .utf8) else { print("无法将JSON字符串转为Data") return } let decoder = JSONDecoder() decoder.dateDecodingStrategy = .formatted(dateFormatter) do { let events = try decoder.decode([Event].self, from: jsonData) print("解析成功!共\(events.count)个事件") // 后续的排序和检测都可以基于这个events数组进行 } catch { print("解析失败:\(error.localizedDescription)") }
第二步:对事件进行排序
既然我们已经把start转成了Date类型,排序就非常简单了——直接按事件的开始时间升序排列:
let sortedEvents = events.sorted { $0.start < $1.start } // 如果你想要降序,就把<改成>
排序后的数组会从最早的事件开始排列,方便后续处理。
第三步:检测事件间的重叠
要判断两个事件是否重叠,核心逻辑是:事件A的开始时间早于事件B的结束时间,且事件B的开始时间早于事件A的结束时间。基于这个逻辑,我们可以写一个函数来找出所有重叠的事件对:
1. 单个重叠检测函数
先写一个辅助函数判断两个事件是否重叠:
func isOverlapping(eventA: Event, eventB: Event) -> Bool { return eventA.start < eventB.end && eventB.start < eventA.end }
2. 找出所有重叠事件对
如果要遍历整个数组找出所有重叠的组合,可以这样做:
func findAllOverlappingPairs(in events: [Event]) -> [(Event, Event)] { var overlappingPairs = [(Event, Event)]() let count = events.count for i in 0..<count { for j in (i+1)..<count { if isOverlapping(eventA: events[i], eventB: events[j]) { overlappingPairs.append((events[i], events[j])) } } } return overlappingPairs } // 使用示例 let overlappingPairs = findAllOverlappingPairs(in: sortedEvents) for pair in overlappingPairs { print("重叠事件:\(pair.0.title) 和 \(pair.1.title)") }
如果你的事件数组已经排序,也可以优化算法,只检查相邻事件(因为排序后如果相邻事件不重叠,后面的事件肯定也不会和前面的重叠),这样效率更高:
func findOverlappingAdjacentPairs(in sortedEvents: [Event]) -> [(Event, Event)] { var overlappingPairs = [(Event, Event)]() for i in 0..<sortedEvents.count-1 { let currentEvent = sortedEvents[i] let nextEvent = sortedEvents[i+1] if isOverlapping(eventA: currentEvent, eventB: nextEvent) { overlappingPairs.append((currentEvent, nextEvent)) } } return overlappingPairs }
这样一套流程下来,解析、排序、重叠检测就都搞定啦!
内容的提问来源于stack exchange,提问作者Ali Abraham
相关产品推荐
相关产品推荐

