簡體   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