繁体   English   中英

如何快速比较两个“通用”数组

[英]How to compare two “generic” array in swift

我有两个数组:

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

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

我发现了一些将数组添加到Set示例,但是Set没有可以接受此arraytype的初始化程序。

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

当您说“比较”时,是指相等,词典比较还是diff? 听起来你想要一个差异。

设置的解决方案可能看起来像这样(假设您希望事物不在一个之中,而又不在两个之中)。

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函数:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM