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

4
如果我有一个结构体...
struct MyStruct {
    let number: Int
}

并且我有一个它们的数组...

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

然后我可以这样做来获取最大的数字...
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个回答

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 }

啊!太棒了,我不知道我可以这样使用maxElement()。谢谢! - Fogmeister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接