2016-01-04 28 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