正确的方法来在Swift中find数组中的最大值

到目前为止,我得到了一个简单的(但可能是昂贵的)方法:

var myMax = sort(myArray,>)[0] 

而我在学校的教学方式如何?

 var myMax = 0 for i in 0..myArray.count { if (myArray[i] > myMax){myMax = myArray[i]} } 

有没有更好的方法来从Swift中的整数数组中获取最大值? 理想情况下,就像Ruby的.max

鉴于:

 let numbers = [1, 2, 3, 4, 5] 

Swift 3:

 numbers.min() // equals 1 numbers.max() // equals 5 

Swift 2:

 numbers.minElement() // equals 1 numbers.maxElement() // equals 5 

更新: 这应该是可接受的答案,因为maxElement出现在Swift中。


使用全能reduce

 let nums = [1, 6, 3, 9, 4, 6]; let numMax = nums.reduce(Int.min, { max($0, $1) }) 

同理:

 let numMin = nums.reduce(Int.max, { min($0, $1) }) 

reduce首先获取内部累加器variables的初始值,然后将传递函数(这里是匿名的)依次应用于累加器和数组的每个元素,并将新值存储在累加器中。 最后的累加器值被返回。

使用Swift 4, Array与其他Sequence协议一致的对象( DictionarySet等)一样,有两个方法,分别是max()max(by:) ,返回序列中的最大元素,如果序列为空,则返回nil


#1。 max()

如果序列中的元素types符合Comparable协议(可能是StringFloatCharacter或者一个自定义的类或结构体),则可以使用具有以下声明的 max()

 @warn_unqualified_access func max() -> Element? 

返回序列中的最大元素。

以下游乐场代码显示使用max()

 let intMax = [12, 15, 6].max() let stringMax = ["bike", "car", "boat"].max() print(String(describing: intMax)) // prints: Optional(15) print(String(describing: stringMax)) // prints: Optional("car") 
 class Route: Comparable, CustomStringConvertible { let distance: Int var description: String { return "Route with distance: \(distance)" } init(distance: Int) { self.distance = distance } static func ==(lhs: Route, rhs: Route) -> Bool { return lhs.distance == rhs.distance } static func <(lhs: Route, rhs: Route) -> Bool { return lhs.distance < rhs.distance } } let routes = [ Route(distance: 20), Route(distance: 30), Route(distance: 10) ] let maxRoute = routes.max() print(String(describing: maxRoute)) // prints: Optional(Route with distance: 30) 

#2。 max(by:)

如果序列中的元素types不符合Comparable协议,则必须使用具有以下声明的 max(by:)

 @warn_unqualified_access func max(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> Element? 

返回序列中的最大元素,使用给定的谓词作为元素之间的比较。

以下游乐场代码显示使用max(by:)

 let dictionary = ["Boat" : 15, "Car" : 20, "Bike" : 40] let keyMaxElement = dictionary.max(by: { (a, b) -> Bool in return a.key < b.key }) let valueMaxElement = dictionary.max(by: { (a, b) -> Bool in return a.value < b.value }) print(String(describing: keyMaxElement)) // prints: Optional(("Car", 20)) print(String(describing: valueMaxElement)) // prints: Optional(("Bike", 40)) 
 class Route: CustomStringConvertible { let distance: Int var description: String { return "Route with distance: \(distance)" } init(distance: Int) { self.distance = distance } } let routes = [ Route(distance: 20), Route(distance: 30), Route(distance: 10) ] let maxRoute = routes.max(by: { (a, b) -> Bool in return a.distance < b.distance }) print(String(describing: maxRoute)) // prints: Optional(Route with distance: 30) 

其他答案都是正确的,但是不要忘记你也可以使用收集操作符,如下所示:

 var list = [1, 2, 3, 4] var max: Int = (list as AnyObject).valueForKeyPath("@max.self") as Int 

你也可以用同样的方法find平均值:

 var avg: Double = (list as AnyObject).valueForKeyPath("@avg.self") as Double 

这个语法可能不像其他一些解决scheme清晰,但是看到-valueForKeyPath:仍然可以使用:)

你可以使用reduce

 let randomNumbers = [4, 7, 1, 9, 6, 5, 6, 9] let maxNumber = randomNumbers.reduce(randomNumbers[0]) { $0 > $1 ? $0 : $1 } //result is 9 

随着Swift 1.2(也许更早)你现在需要使用:

 let nums = [1, 6, 3, 9, 4, 6]; let numMax = nums.reduce(Int.min, combine: { max($0, $1) }) 

为了处理Double值,我使用了这样的东西:

 let nums = [1.3, 6.2, 3.6, 9.7, 4.9, 6.3]; let numMax = nums.reduce(-Double.infinity, combine: { max($0, $1) }) 

在Swift 2.0中, minElementmaxElement成为SequenceType协议的方法,您应该像这样调用它们:

 let a = [1, 2, 3] print(a.maxElement()) //3 print(a.minElement()) //1 

使用maxElement作为函数,如maxElement(a)现在不可用

Swift的语法是不断变化的,所以我可以在Xcode version7 beta6中确认。

它可能会在将来被修改,所以我build议你最好在使用这些方法之前检查一下文档。

 var numbers = [1, 2, 7, 5]; var val = sort(numbers){$0 > $1}[0]; 

Swift 3.0

您可以以编程方式尝试此代码。

 func getSmallAndGreatestNumber() -> Void { let numbers = [145, 206, 116, 809, 540, 176] var i = 0 var largest = numbers[0] var small = numbers[0] while i < numbers.count{ if (numbers[i] > largest) { largest = numbers[i] } if (numbers[i] < small) { small = numbers[i] } i = i + 1 } print("Maximum Number ====================\(largest)")// 809 print("Minimum Number ====================\(small)")// 116 } 

你也可以对数组sorting,然后使用array.firstarray.last