You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:52:47