지금까지 간단하지만 비용이 많이 드는 방법이 있습니다.
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]
스위프트 3 :
numbers.min() // equals 1
numbers.max() // equals 5
스위프트 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
내부 누산기 변수의 초기 값인 첫 번째 값을 취한 다음 전달 된 함수 (여기서는 익명)를 누산기와 배열의 각 요소에 연속적으로 적용하고 누산기에 새 값을 저장합니다. 그런 다음 마지막 누산기 값이 반환됩니다.
답변
스위프트 (5), Array
기타와 같은 Sequence
프로토콜 따르는 물체 ( Dictionary
, Set
등)이라는 두 가지 방법이 있습니다 max()
및 max(by:)
순서를 돌려 최대 요소 또는 nil
시퀀스는 비어있는 경우.
#1. 사용 Array
의 max()
방법을
시퀀스 내부의 요소 유형이 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. 사용 Array
의를max(by:)
방법을
시퀀스 내부의 요소 유형이 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
같은 방법으로 평균을 찾을 수도 있습니다.
var avg: Double = (list as AnyObject).valueForKeyPath("@avg.self") as Double
이 구문은 다른 솔루션보다 명확하지 않을 수 있지만 -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
답변
var numbers = [1, 2, 7, 5];
var val = sort(numbers){$0 > $1}[0];
답변
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) })