2016-01-04 219 views
4

如果我有一個結構......獲取元素,最大財產陣列

struct MyStruct { 
    let number: Int 
} 

,我有他們的數組...

var array = [MyStruct]() 
// populate array with MyStructs 

然後,我可以做到這一點,以獲得最大number ...

var maxNumber = 0 

for tempStruct in array where tempStruct.number > maxNumber { 
    maxNumber = tempStruct.number 
} 

但是,我不能使用...

let maxStruct = array.maxElement() 

因爲MyStruct沒有可比性。我可以使它具有可比性,但是我可能還會有一個我希望通過比較的日期戳,以便使它成爲Comparable並不理想。

有沒有另一種方法可以做到這一點,更優雅?

....

我只是想,我也能做到這一點...

let maxStruct = array.sort{$0.number > $1.number}.first() 

這將需要花費更多的時間。我不確定它使用哪種排序方法,但它可能是n log(n),而我的初始方法將只是n

回答

6

sort()/sortInPlace(),也有的min/maxElement()兩個變體:第一 要求序列元件是可比較的:

extension SequenceType where Generator.Element : Comparable { 

    public func minElement() -> Self.Generator.Element? 
    public func maxElement() -> Self.Generator.Element? 
} 

第二有沒有這樣的限制,並採取比較 作爲參數來代替:

extension SequenceType { 

    public func minElement(@noescape isOrderedBefore: (Self.Generator.Element, Self.Generator.Element) throws -> Bool) rethrows -> Self.Generator.Element? 
    public func maxElement(@noescape isOrderedBefore: (Self.Generator.Element, Self.Generator.Element) throws -> Bool) rethrows -> Self.Generator.Element? 
} 

在你的情況,你可以使用maxElement()與比較器功能:

// Swift 2: 
let maxStruct = array.maxElement { $0.number < $1.number } 
// Swift 3: 
let maxStruct = array.max { $0.number < $1.number } 
+0

啊!太棒了,我不知道我可以這樣使用'maxElement()'。謝謝 – Fogmeister