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 d'entiers dans Swift? Idéalement quelque chose qui est une ligne comme Ruby.max
maxElement(myArray)
. Voir quelle est actuellement la deuxième réponse (Rudolf Adamkovic) ci-dessous.Réponses:
Donné:
Swift 3:
Swift 2:
la source
Comparable
objets, doncNSDecimalNumber
ne fonctionnera pas par exemple.min()
etmax()
.minElement
etmaxElement
ont été renomméesmin
etmax
. voir: github.com/apple/swift-evolution/blob/master/proposals/...~~V~~singular~~1st Je comprends votre confusion, car les fonctions libresmin
etmax
aussi existent encore. Voir, par exemple, gist.github.com/lorentey/d679064cb29df4558534d619319a1d9eMise à jour: Cela devrait probablement être la réponse acceptée depuis son
maxElement
apparition dans Swift.Utilisez le tout-puissant
reduce
:De même:
reduce
prend une première valeur qui est la valeur initiale d'une variable d'accumulateur interne, puis applique la fonction passée (ici, c'est anonyme) à l'accumulateur et à chaque élément du tableau successivement, et stocke la nouvelle valeur dans l'accumulateur. La dernière valeur de l'accumulateur est ensuite renvoyée.la source
nums.reduce(Int.min, max)
puisquemax
le prototype du prototype correspond déjà au typereduce
attendulet numMax = nums.reduce(Int.min, combine: max)
Avec Swift 5,
Array
comme les autresSequence
objets conforme au Protocole (Dictionary
,Set
, etc.), dispose de deux méthodes appeléesmax()
etmax(by:)
que l'élément de retour maximale dans la séquence ounil
si la séquence est vide.#1. En utilisant
Array
lamax()
méthode deSi le type d'élément dans votre séquence est conforme au
Comparable
protocole (peut - ilString
,Float
,Character
ou un de votre classe personnalisée ou struct), vous serez en mesure d'utilisermax()
qui a la suivante déclaration :Les codes Playground suivants montrent à utiliser
max()
:# 2. Utilisation de
Array
lamax(by:)
méthode deSi le type d'élément dans votre séquence n'est pas conforme au
Comparable
protocole, vous devrez utilisermax(by:)
qui a la déclaration suivante :Les codes Playground suivants montrent à utiliser
max(by:)
:la source
Les autres réponses sont toutes correctes, mais n'oubliez pas que vous pouvez également utiliser des opérateurs de collecte, comme suit:
vous pouvez également trouver la moyenne de la même manière:
Cette syntaxe est peut-être moins claire que certaines des autres solutions, mais il est intéressant de voir qu'elle
-valueForKeyPath:
peut toujours être utilisée :)la source
Vous pouvez utiliser avec
reduce
:la source
la source
var myMax = sort(myArray,>)[0]
Avec Swift 1.2 (et peut-être plus tôt), vous devez maintenant utiliser:
Pour travailler avec les valeurs Double, j'ai utilisé quelque chose comme ceci:
la source
let numMax = nums.reduce(-Double.infinity, combine: max)
, la signature de la fonction max correspond à la signature du paramètre combine:.Dans Swift 2.0,
minElement
etmaxElement
devenez des méthodes deSequenceType
protocole, vous devriez les appeler comme:L'utilisation en
maxElement
tant que fonction commemaxElement(a)
n'est pas disponible pour le moment.La syntaxe de Swift est en évolution, je peux donc simplement le confirmer dans Xcode version7 beta6 .
Il peut être modifié à l'avenir, donc je suggère que vous fassiez mieux de vérifier la documentation avant d'utiliser ces méthodes.
la source
Swift 3.0
Vous pouvez essayer ce code par programme.
la source
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()
la source
Utilisez ci-dessous de simples lignes de code pour trouver le maximum du tableau;
la source
Vous pouvez également trier votre tableau, puis utiliser
array.first
ouarray.last
la source