利用Swift进行这种有序集合算法的更惯用的方法是什么?

时间:2015-05-15 16:06:57

标签: swift

我正在使用Array和一个看起来像的自定义类在Swift中建模时间序列日志:

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

当我获取日志的更新时,我维护不变量的不变量(通过匹配时间推断),并且它们按begin属性按顺序排序。我对这些数据的三个用途是:

  1. 访问最新(最后)元素(这种情况很多)
  2. 按顺序枚举它们(用于可视化时间序列)
  3. 向列表中添加新值,这会在定期更新时发生,但不会那么多
  4. 我可以做一些快速检查,例如“这是一个添加过去的结尾还是前面的”,它会照顾很多,但是当我发现我必须插入中间位置的情况时,我来了以下内容:

    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是否给了我一些可以解决这个“搜索插入点和条件插入”算法的工具/习语?

    我愿意使用除Array和简单事件类之外的其他类;我查看了使用树,但虽然这使得插入可能更快,但我认为它会花费更多的内存以及枚举和最后一个元素访问(我的主要用例)更慢。

1 个答案:

答案 0 :(得分:1)

首先,在Swift中,如果你没有充分的理由让它成为一个类,那就把它变成一个结构。

其次,在回答你的实际问题时,我所做的远不如你想象的那么简单:我只会让StatusEvent成为可比较的(即它知道一个StatusEvent比另一个更大,如果它{ {1}}更大)然后只需添加一个新的状态事件并在begin上对数组进行排序。

这可能有第二个好处;你必须使StatusEvent成为Equatable,如果你的<相同,你决定两个StatusEvent是相同的,你可以使用begin来确定一个StatusEvent是否具有相同的{{1} }已存在于数组中。

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

find
相关问题