J'ai jusqu'à présent un moyen simple (mais potentiellement coûteux):
var myMax = sort(myArray,>)[0]
Et comment on m'a appris à le faire à l'école:
var myMax = 0
for i in 0..myArray.count {
if (myArray[i] > myMax){myMax = myArray[i]}
}
Existe-t-il un meilleur moyen d'obtenir la valeur maximale d'un tableau entier dans Swift? Idéalement, quelque chose comme une ligne telle que .max
de Ruby
Donné:
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
Update:Ceci devrait probablement être la réponse acceptée puisque maxElement
est apparu dans Swift.
Utilisez le tout-puissant reduce
:
let nums = [1, 6, 3, 9, 4, 6];
let numMax = nums.reduce(Int.min, { max($0, $1) })
De même:
let numMin = nums.reduce(Int.max, { min($0, $1) })
reduce
prend une première valeur qui est la valeur initiale d'une variable d'accumulateur interne, puis applique la fonction passée (ici, il est anonyme) à l'accumulateur et à chaque élément du tableau, et stocke la nouvelle valeur dans l'accumulateur. La dernière valeur d'accumulateur est ensuite renvoyée.
Les autres réponses sont toutes correctes, mais n'oubliez pas que vous pouvez également utiliser des opérateurs de collecte, comme suit:
var list = [1, 2, 3, 4]
var max: Int = (list as AnyObject).valueForKeyPath("@max.self") as Int
vous pouvez également trouver la moyenne de la même manière:
var avg: Double = (list as AnyObject).valueForKeyPath("@avg.self") as Double
Cette syntaxe est peut-être moins claire que d'autres solutions, mais il est intéressant de voir que -valueForKeyPath:
peut toujours être utilisé :)
Vous pouvez utiliser avec reduce
:
let randomNumbers = [4, 7, 1, 9, 6, 5, 6, 9]
let maxNumber = randomNumbers.reduce(randomNumbers[0]) { $0 > $1 ? $0 : $1 } //result is 9
Avec Swift 1.2 (et peut-être plus tôt), vous devez maintenant utiliser:
let nums = [1, 6, 3, 9, 4, 6];
let numMax = nums.reduce(Int.min, combine: { max($0, $1) })
Pour travailler avec les valeurs Double, j'ai utilisé quelque chose comme ceci:
let nums = [1.3, 6.2, 3.6, 9.7, 4.9, 6.3];
let numMax = nums.reduce(-Double.infinity, combine: { max($0, $1) })
Dans Swift 2.0, les variables minElement
et maxElement
deviennent des méthodes du protocole SequenceType
, vous devez les appeler comme suit:
let a = [1, 2, 3]
print(a.maxElement()) //3
print(a.minElement()) //1
Utiliser maxElement
en tant que fonction commemaxElement(a)
est indisponible maintenant.
La syntaxe de Swift est en pleine mutation, je ne peux donc que confirmer cela dans Xcode version7 beta6 .
Il sera peut-être modifié ultérieurement. Je vous suggère donc de vérifier le document avant d'utiliser ces méthodes.
Swift 3.0
Vous pouvez essayer ce code par programmation.
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
}
Mise à jour pour Swift 3/4:
Utilisez ci-dessous de simples lignes de code pour trouver le maximum du tableau;
var num = [11, 2, 7, 5, 21]
var result = num.sorted(){
$0 > $1
}
print("max from result: \(result[0])") // 21
var numbers = [1, 2, 7, 5];
var val = sort(numbers){$0 > $1}[0];
Voici un test de performance pour les solutions publiées ici. https://github.com/tedgonzalez/MaxElementInCollectionPerformance
C'est le plus rapide pour Swift 5
array.max()