[英]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.