从数组中获取具有max属性的元素

时间:2016-01-04 14:53:53

标签: arrays swift max

如果我有结构......

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无法比较。我可以使它具有可比性但是我可能还有一个我要比较的日期戳,因此使它可比较并不理想。

我还能采用另一种更优雅的方式吗?

...

我只是想,我也可以这样做......

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

但这需要更多时间。我不确定它使用哪种排序方法,但它可能是n log(n),而我的初始方法只是n

1 个答案:

答案 0 :(得分: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 }