Recherche NSArray pour la valeur correspondant à la valeur
J'ai un NSArray de objects
, qui a une propriété particulière appelée name
(type NSString).
J'ai un deuxième NSArray de NSStrings qui sont names
.
Je voudrais obtenir un NSArray de tous les objects
dont .name
propriété correspond à l'une des names
dans la deuxième NSArray.
Comment dois-je faire à ce sujet, rapide et efficace que ce sera nécessaire assez souvent.
- Boucle par le biais de votre NSArray avec une boucle for, et ajouter des objets correspondants (trouvé avec containsObject) à un NSMutableArray.
- Voir ma Réponse ci-dessous
Vous devez vous connecter pour publier un commentaire.
Avec votre actuelle des structures de données, vous ne pouvez le faire qu'en O(n^2) en faisant une boucle sur le premier tableau, une fois pour chaque membre de la deuxième tableau:
(Suppléant comme suggéré par Stefan: boucle sur les objets de tableau et demander les noms tableau si il
containsObject:
pour le nom de chaque objet.)Mais si cela doit vraiment être plus rapide (dépend vraiment de la taille des tableaux autant que combien de fois vous le faites), vous pouvez améliorer cela en introduisant un NSDictionary que les cartes de la
names
dans le premier tableau, à leurs objets. Ensuite, chacun de ces recherches est O(1) et le temps total est O(n). (Vous auriez à garder ce dictionnaire toujours en phase avec le tableau d'objets, ce qui n'est pas dur avec raisonnable accesseurs. Cette technique a aussi la contrainte de la mêmename
ne peuvent pas apparaître sur plus d'un objet.)Une autre façon d'obtenir ce résultat (et qui n'ont pas cette dernière contrainte est d'utiliser un NSSet pour votre deuxième collection, puis à pied à travers les objets de la matrice de l'appel de
containsObject:
avec chacun d'eux sur l'ensemble des noms. Si cette technique est mieux dépend de deux collections sont à peu près de la même taille, ou si l'une est beaucoup plus grande que les autres.NSDictionary
pour le premier tableau ne fonctionne que si aucun de vos objets contiennent les mêmesname
- dépend de votre domaine. Des mineurs de mise en garde de côté, quixoto est correcte - vous de ne pas améliorer les choses sans redéfinir vos structures de données.Pourquoi ne pas simplement utiliser les prédicats de le faire pour vous?:
predicateWithBlock
qui est encore plus pratique.MATCHES
n'est applicable qu'àNSString
s. Pour un objet générique, vous devez utiliser le==
opérateur de comparaison. I. e.:NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF == %@", value];
NSArray *results = [array_to_search filteredArrayUsingPredicate:predicate];
Voici une façon simple:
J'aime utiliser cette méthode:
Les méthodes les plus utiles seront:
et
Le second utilise un bloc de code, pas disponible sur iOS avant 4.0
Ces deux sera plus efficace qu'une itération directement.
Il y a un bon exemple ici:
http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxUsing.html