vérifier si tous les éléments d'un tableau ont la même valeur dans Swift
Est-il une fonction dans Swift qui vérifie si tous les éléments d'un tableau ont la même valeur? Dans mon cas, c'est un tableau de type Int
. Je sais que je peux le parcourir à l'aide d'une simple boucle for, je me demandais juste si il y a quelque chose qui se construit dans et plus rapide.
Vous devez vous connecter pour publier un commentaire.
Toute méthode doit itérer sur tous les éléments jusqu'à ce qu'un autre élément est trouvé:
Au lieu d'une volonté explicite de la boucle, vous pouvez utiliser le
contains()
fonction:Si les éléments du tableau sont
Hashable
(commeInt
), alors vous pouvezcréer un
Set
(disponible depuis Swift 1.2) de la matrice d'éléments et de vérifier si elle a exactement un seul élément.Une rapide analyse comparative de test a révélé que la "contient" la méthode est beaucoup plus rapide que la méthode
pour un tableau de 1 000 000 d'entiers, en particulier si les éléments sont
pas tous égaux. Ce sens parce que
contains()
retourne dèsen tant que non-élément correspondant n'est trouvé, alors que
Set(array)
toujoursparcourt l'ensemble de la matrice.
Également la "contient" méthodes est aussi rapide ou légèrement plus rapide qu'un explicite de la boucle.
Ici est une simple analyse comparative de code. Bien sûr, les résultats peuvent varier
avec la taille de la matrice, le nombre de différents éléments et les éléments de type de données.
Des résultats (sur un MacBook Pro, la Libération de configuration):
Avec
array[1_000] = 2
les résultats sontMise à jour pour Swift 2/Xcode 7: en Raison de divers changements dans la Swift
la syntaxe, la fonction est désormais rédigé comme
Mais désormais, vous pouvez également le définir comme une méthode d'extension pour les tableaux:
equal
etRepeat
:array.first.map { equal(array, Repeat(count: array.count, repeatedValue: $0)) } ?? true
(plus lentement)array[500_000] = 2
je mesure 0.001789 sec etarray[1_000] = 2
3.99 e-06 sec.extension Array
pour vérifier si seulementseveral elements of an array
ont la même valeur?Soliution pour Swift 4.2/Xcode 10:
Si votre version actuelle de Xcode est avant 10.0 vous pouvez trouver la fonction
allSatisfy
deArraySlice
dans Xcode9to10Preparation. Vous pouvez installer cette bibliothèque avec CocoaPods.dropLast()
.dropLast()
ici. Dans mon exemple, si je vais l'enleverdropLast()
le bloc transmis àallSatisfy
sera appelé 4 fois, mais maintenant, c'est l'appel que 3 fois, et le résultat est le même.Avec Swift 5, vous pouvez utiliser l'une des quatre manières suivantes pour les tests, si tous les éléments d'un tableau sont égaux.
#1. À l'aide de
Array
'sallSatisfy(_:)
méthodeallSatisfy(_:)
renvoie une valeur Booléenne indiquant si chaque élément d'une séquence répond à un prédicat. Vous pouvez définir le prédicat de tester si tous les éléments de la matrice sont égales:#2. À l'aide de
Array
'sréduire(_:_:)
méthodeComme une alternative à
allSatisfy(_:)
, vous pouvez utiliserreduce(_:_:)
:#3. À l'aide de
elementsEqual(_:)
méthodeelementsEqual(_:)
renvoie une valeur Booléenne indiquant si les deux séquences contiennent les mêmes éléments dans le même ordre. Par conséquent, vous pouvez créer une nouvelle collection en répétant le premier élément de la table initiale et de comparer l'ancien avec le dernier:#4. À l'aide de
Set
'sinit(_:)
initalizerSi tous les éléments d'un tableau sont l'égalité, la création d'un ensemble à partir de ce tableau devraient aboutir dans le jeu de n'avoir qu'un seul élément: