如何比较两个"泛型" swift

时间:2015-05-23 12:31:01

标签: arrays swift

我有两个数组:

var tstFrames = [TimeFrame]()
var tstFramesRefresh = [TimeFrame]()

有人知道如何比较它们吗?

我找到了一些将数组添加到Set的示例,但是Set没有可以接受此数组类型的初始化程序.. :(

两个数组具有几乎相同的TimeFrame对象实例,但是tstFramesRefresh还有一个不在tstFrames数组中的数据,我会获得一个TimeFrame对象。

1 个答案:

答案 0 :(得分:4)

当你说“比较”时 - 你的意思是平等,词典比较,还是差异?听起来你想要一个差异。

设定的解决方案可能看起来像这样(假设你想要的东西不是另一个,而不是两者的分离):

let a = [1,2,3]
let b = [1,2]

Set(a).subtract(b)  // returns a set of {3}

据推测,您的问题是TimeFrame不是Hashable,因此它不会在集合中发挥作用。

您可以改为使用contains来检查a的每个元素是否是b的成员。不幸的是,对于大型集合而言,这将是非常低效的,因为contains在线性时间内工作,因此复杂度将为O(n^2)。但这很容易做到:

func subtract<S: SequenceType, C: CollectionType, T: Equatable
    where C.Generator.Element == T, S.Generator.Element == T>
    (source: S, toSubtract: C) -> [S.Generator.Element] {
        return filter(source) { !contains(toSubtract, $0) }
}


subtract(a, b)  // returns [3]

如果您的对象Comparable可以使用排序或树结构,则效率更高的解决方案。

如果您的对象也不是Equatable,那么您需要一个关闭来检查等价的版本:

func subtract<S: SequenceType, C: CollectionType>
    (source: S, toSubtract: C,
     isEquivalent: (S.Generator.Element, C.Generator.Element) -> Bool)
    -> [S.Generator.Element] {
        let x = filter(source) { elem in
            return !contains(toSubtract) { isEquivalent(elem,$0) }
        }
        return x
}

subtract(a, b) { $0 == $1 }

如果你只想检查它们是否相等,那么==将会这样做 - 除非对象不相等,在这种情况下使用带有比较器功能的equal函数: / p>

// asuming these are classes and reference equality is reasonable thing to check
equal(tstFrames, tstFramesRefresh) { $0 === $1 } 
相关问题