Je dois inverser mon NSArray
.
Par exemple:
[1,2,3,4,5]
doit devenir: [5,4,3,2,1]
Quelle est la meilleure façon d'y parvenir?
objective-c
nsarray
Andy Jacobs
la source
la source
Réponses:
Pour obtenir une copie inversée d'un tableau, regardez la solution de danielpunkass en utilisant
reverseObjectEnumerator
.Pour inverser un tableau mutable, vous pouvez ajouter la catégorie suivante à votre code:
la source
Il existe une solution beaucoup plus simple si vous tirez parti de la
reverseObjectEnumerator
méthode intégréeNSArray
et de laallObjects
méthode deNSEnumerator
:allObjects
est documenté comme renvoyant un tableau avec les objets qui n'ont pas encore été parcourus avecnextObject
, dans l'ordre:la source
Quelques repères
1. reverseObjectEnumerator allObjects
C'est la méthode la plus rapide:
Résultat:
executionTime = 0.000026
2. Itération sur un reverseObjectEnumerator
C'est entre 1,5x et 2,5x plus lentement:
Résultat:
executionTime = 0.000071
3. sortedArrayUsingComparator
C'est entre 30x et 40x plus lent (pas de surprise ici):
Résultat:
executionTime = 0.001100
Il en
[[anArray reverseObjectEnumerator] allObjects]
va de même pour la vitesse et la facilité.la source
enumerateObjectsWithOptions:NSEnumerationReverse
?enumerateObjectsWithOptions:NSEnumerationReverse
- celui du haut terminé en0.000072
quelques secondes, la méthode des blocs en0.000009
quelques secondes.DasBoot a la bonne approche, mais il y a quelques erreurs dans son code. Voici un extrait de code complètement générique qui inversera tout NSMutableArray en place:
Vous pouvez envelopper dans une fonction C, ou pour des points bonus, utilisez des catégories pour l'ajouter à NSMutableArray. (Dans ce cas, 'array' deviendrait 'self'.) Vous pouvez également l'optimiser en l'assignant
[array count]
à une variable avant la boucle et en utilisant cette variable, si vous le souhaitez.Si vous ne disposez que d'un NSArray normal, il n'y a aucun moyen de l'inverser en place, car les NSArrays ne peuvent pas être modifiés. Mais vous pouvez faire une copie inversée:
Ou utilisez cette petite astuce pour le faire en une seule ligne:
Si vous voulez simplement faire une boucle sur un tableau en arrière, vous pouvez utiliser une boucle
for
/in
avec[array reverseObjectEnumerator]
, mais c'est probablement un peu plus efficace à utiliser-enumerateObjectsWithOptions:usingBlock:
:( Remarque : substantiellement mis à jour en 2014 avec cinq années supplémentaires d'expérience de la Fondation, une ou deux nouvelles fonctionnalités Objective-C et quelques conseils tirés des commentaires.)
la source
Après avoir examiné les réponses des autres ci-dessus et trouvé la discussion de Matt Gallagher ici
Je propose ceci:
Comme Matt l'observe:
Peu de temps après, il répond ainsi:
la source
Les catégories de Georg Schölly sont très agréables. Cependant, pour NSMutableArray, l'utilisation de NSUIntegers pour les index entraîne un blocage lorsque le tableau est vide. Le bon code est:
la source
La façon la plus efficace d'énumérer un tableau à l'envers:
Utilisez
enumerateObjectsWithOptions:NSEnumerationReverse usingBlock
. En utilisant le benchmark de @ JohannesFahrenkrug ci-dessus, cela a été 8 fois plus rapide que[[array reverseObjectEnumerator] allObjects];
:la source
la source
Inverser le tableau et le parcourir:
la source
Pour mettre à jour cela, dans Swift cela peut être fait facilement avec:
la source
Quant à moi, avez-vous réfléchi à la façon dont le tableau a été rempli en premier lieu? J'étais en train d'ajouter de NOMBREUX objets à un tableau, et j'ai décidé d'insérer chacun au début, en poussant tous les objets existants par un. Nécessite un tableau mutable, dans ce cas.
la source
Ou la voie Scala:
la source
Il existe un moyen simple de le faire.
J'espère que ça aide.
la source
Je ne connais aucune méthode intégrée. Mais, le codage à la main n'est pas trop difficile. En supposant que les éléments du tableau que vous traitez sont des objets NSNumber de type entier, et «arr» est le NSMutableArray que vous souhaitez inverser.
Puisque vous commencez avec un NSArray, vous devez d'abord créer le tableau mutable avec le contenu du NSArray d'origine ('origArray').
Edit: Correction de n -> n / 2 dans le nombre de boucles et modification de NSNumber en identifiant plus générique en raison des suggestions dans la réponse de Brent.
la source
Si tout ce que vous voulez faire est d'itérer en sens inverse, essayez ceci:
Vous pouvez faire le [myArrayCount] une fois et l'enregistrer dans une variable locale (je pense que c'est cher), mais je suppose également que le compilateur fera à peu près la même chose avec le code écrit ci-dessus.
la source
Syntaxe Swift 3:
la source
Essaye ça:
la source
Voici une belle macro qui fonctionnera pour NSMutableArray OU NSArray:
Pour utiliser simplement appeler:
reverseArray(myArray);
la source