gpt4 book ai didi

swift - 利用 Swift 实现此排序集算法的更惯用方法是什么?

转载 作者:行者123 更新时间:2023-11-30 10:15:29 25 4
gpt4 key购买 nike

我正在 Swift 中使用 Array 和一个自定义类来建模时间序列日志,如下所示:

class StatusEvent {
var status:ValveStatus // this is just an enum
var begin:NSDate
}

当我更新日志时,我保持不变,即不存在重复项(通过匹配时间推断),并且它们按 begin 属性按顺序排序。我对此数据的三个用途是:

  1. 访问最新(最后一个)元素(这种情况经常发生)
  2. 按顺序枚举它们(用于可视化时间序列)
  3. 向列表中添加新值,这会在定期更新时发生,但不会太多

我可以做一些快速检查,例如“这是添加过去的结尾还是前面的添加”,这可以处理很多问题,但是当我检测到必须在中间某处插入的情况时,我来了加上以下内容:

var begin = oldestLogEvent.begin
for index in 1..<self.statusLog.count {
let event = self.statusLog[index]
let end = event.begin
if newEvent.begin == end {
return false;
}
if begin < newEvent.begin && newEvent.begin < end {
self.statusLog.insert(newEvent, atIndex: index)
return true;
}
begin = end;
}

我返回一个 Bool 指示插入是否发生。

从 Objective-C 移植后,我很好奇 Swift 是否能给我一些工具/习惯用法来解决这个“搜索插入点并有条件插入”算法?

我愿意使用数组和简单事件类以外的其他类;我考虑过使用树,但是虽然这可能会使插入速度更快,但我认为这会消耗更多内存,并使枚举和最后一个元素访问(我的主要用例)变慢。

最佳答案

首先,在 Swift 中,如果你没有充分的理由将某个东西设为类,请将其设为结构体。

其次,在回答您的实际问题时,我要做的远没有您想象的那么计算机科学:我只是将 StatusEvent 设为可比较(即,如果它的 begin ,它知道一个 StatusEvent 比另一个更大)更大),然后添加一个新的状态事件并在 < 上对数组进行排序。

这可能还有第二个好处;您必须将 StatusEvent 设置为 Equatable,如果您认为两个 StatusEvent 相等(如果它们的 begin 相同),则可以仅使用 find 来确定数组中是否已存在具有相同 begin 的 StatusEvent。

这是一个简化的示例(我使用 Int 而不是 Date):

func == (lhs:StatusEvent, rhs:StatusEvent) -> Bool {
return lhs.begin == rhs.begin
}
func < (lhs:StatusEvent, rhs:StatusEvent) -> Bool {
return lhs.begin < rhs.begin
}
struct StatusEvent : Comparable {
var begin : Int = 0
}
var arr = [StatusEvent(begin:3), StatusEvent(begin:2)]
let se = StatusEvent(begin:1)
if find(arr,se) == nil { // not already present
arr.append(se)
arr.sort(<)
}

关于swift - 利用 Swift 实现此排序集算法的更惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30264037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com