web-dev-qa-db-fra.com

Manière correcte de trouver max dans un tableau dans Swift

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

98
Charlie Egan

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
250
Rudolf Adamkovič

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.

90

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é :)

13
Sam

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
8
Khuong

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) })
2
Allen Conquest

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.

1
Shi XiuFeng

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
}
0

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
0
Kiran jadhav
var numbers = [1, 2, 7, 5];    
var val = sort(numbers){$0 > $1}[0];
0
androabhay

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()

0
Ted