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