Swift Array에서 최소/최대값 검색
Swift 숫자 배열이 지정된 경우 최소값과 최대값을 찾으려면 어떻게 해야 합니까?
지금까지 심플한(그러나 잠재적으로 비용이 많이 드는) 방법을 생각해 왔습니다.
var myMax = sort(myArray,>)[0]
그리고 학교에서 어떻게 배웠는지:
var myMax = 0
for i in 0..myArray.count {
if (myArray[i] > myMax){myMax = myArray[i]}
}
Swift의 정수 어레이에서 최소값 또는 최대값을 얻을 수 있는 더 좋은 방법이 있습니까?이상적으로는 Ruby's와 같은 한 줄의 라인입니다..min
그리고..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
어레이의 최소값과 최대값을 직접 계산하려면reduce
이 솔루션은 이전 버전에서는.min()
그리고..max()
스위프트에 출연하고 있습니다.
전능하신 분들을 이용하다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
는 내부 어큐뮬레이터 변수의 초기값인 첫 번째 값을 가져온 다음 전달된 함수(여기서는 익명)를 어큐뮬레이터 및 어레이의 각 요소에 순차적으로 적용하여 새 값을 어큐뮬레이터에 저장합니다.그러면 마지막 누적기 값이 반환됩니다.
Swift 5에서는Array
, 다른 것과 같이Sequence
프로토콜 준수 개체(Dictionary
,Set
( , etc )에는, 다음의 2개의 방법이 있습니다.max()
그리고.max(by:)
시퀀스 내의 최대 요소를 반환하거나nil
시퀀스가 비어 있는 경우.
#1. 사용방법Array
의max()
방법
시퀀스 내의 요소 유형이 다음 조건을 충족하는지 여부Comparable
protocol(그럴 수도 있음)String
,Float
,Character
또는 커스텀 클래스 또는 구조 중 하나)를 사용할 수 있습니다.max()
다음 선언이 있습니다.
@warn_unqualified_access func max() -> Element?
시퀀스의 최대 요소를 반환합니다.
다음 Playground 코드는 사용법을 보여줍니다.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
protocol을(를)max(by:)
다음 선언이 있습니다.
@warn_unqualified_access func max(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> Element?
지정된 술어를 요소 간 비교로 사용하여 시퀀스의 최대 요소를 반환합니다.
다음 Playground 코드는 사용법을 보여줍니다.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
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
}
Swift 1.2(또는 그 이전 버전)에서는 다음을 사용해야 합니다.
let nums = [1, 6, 3, 9, 4, 6];
let numMax = nums.reduce(Int.min, combine: { max($0, $1) })
Double Value를 사용하기 위해 다음과 같은 방법을 사용했습니다.
let nums = [1.3, 6.2, 3.6, 9.7, 4.9, 6.3];
let numMax = nums.reduce(-Double.infinity, combine: { max($0, $1) })
2에서는 Swift 2.0을 사용하고 .minElement
★★★★★★★★★★★★★★★★★」maxElement
이 SequenceType
프로토콜은 다음과 같이 불러야 합니다.
let a = [1, 2, 3]
print(a.maxElement()) //3
print(a.minElement()) //1
「」를 사용합니다.maxElement
같은 기능은 현재 사용할 수 없습니다.
Swift의 구문은 유동적이기 때문에 Xcode version 7 beta6에서 확인만 하면 됩니다.
향후 수정될 가능성이 있으므로 이 방법을 사용하기 전에 문서를 확인하는 것이 좋습니다.
여기에 게재된 솔루션의 퍼포먼스 테스트를 나타냅니다.https://github.com/tedgonzalez/MaxElementInCollectionPerformance
Swift 5가 가장 빠릅니다.
array.max()
var numbers = [1, 2, 7, 5];
var val = sort(numbers){$0 > $1}[0];
애플이 2021년에 선보인 스위프트 알고리즘은 고도로 최적화된 것을 포함하고 있다.
문서의 예:
let numbers = [7, 1, 6, 2, 8, 3, 9]
if let (smallest, largest) = numbers.minAndMax(by: <) {
// Work with 1 and 9....
}
총 복잡도는 O(k log k + nk)이며, k가 소량일 경우 O(n)에 가까운 런타임이 발생합니다.k가 대량(컬렉션의 10% 이상)인 경우 어레이 전체를 정렬하는 것으로 돌아갑니다.현실적으로 이는 최악의 경우가 실제로는 O(n log n)임을 의미합니다.
Swift 3/4용으로 업데이트됨:
아래의 간단한 코드 행을 사용하여 어레이에서 최대값을 구합니다.
var num = [11, 2, 7, 5, 21]
var result = num.sorted(){
$0 > $1
}
print("max from result: \(result[0])") // 21
학교에서 가르치는 방식이 잠재적으로 비싸다고 생각하는 이유가 궁금해서요?【O(N)】는 【O(N)】를 의미합니다.실제로 , 차수의 할 수 .reduce
.
따라서 성능 면에서는 for loop이 가장 좋다고 생각합니다.맥스를 찾는 데 O(N)보다 더 좋은 건 없을 거야
그냥 ..max()
사과가 제공하는 방법이 가장 좋은 방법입니다.
최소값과 최대값을 모두 원하는 경우, 효율적인 접근법은 단일 값을 사용하는 것입니다.reduce
플플: :
let values = [11, 2, 7, 5, 21]
let (minimum, maximum) = values.reduce((Int.max, Int.min)) {
(min($0.0, $1), max($0.1, $1))
}
print(minimum, maximum) // 2, 21
let array: [Int] = [2, -22, -1, -5600, 333, -167]
var min = 0
var max = array[0]
for i in array {
// finding the min
if min > i {
min = i
}
// finding the max
if max < i {
max = i
}
}
print("Minimum: \(min)\nMaximum: \(max)")
하여 ""를 사용할 도 있습니다.array.first
★★★★★★★★★★★★★★★★★」array.last
언급URL : https://stackoverflow.com/questions/24036514/find-min-max-value-in-swift-array
'source' 카테고리의 다른 글
패키지가 설치되어 있는지 확인하고 설치되어 있지 않으면 어떻게 해야 합니까? (0) | 2023.04.14 |
---|---|
PowerShell에서 문자열을 정수로 변환하는 방법 (0) | 2023.04.14 |
WPF WebBrowser 컨트롤을 사용할 때 스크립트 오류를 억제하려면 어떻게 해야 합니까? (0) | 2023.04.14 |
목표 C에서 NSAray를 되돌리려면 어떻게 해야 하나요? (0) | 2023.04.09 |
Swift: 객체 배열을 알파벳 순으로 정렬합니다. (0) | 2023.04.09 |