正确的方法来在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
协议一致的对象( Dictionary
, Set
等)一样,有两个方法,分别是max()
和max(by:)
,返回序列中的最大元素,如果序列为空,则返回nil
。
#1。 max()
如果序列中的元素types符合Comparable
协议(可能是String
, Float
, Character
或者一个自定义的类或结构体),则可以使用具有以下声明的 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中, minElement
和maxElement
成为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.first
或array.last