2011-04-02 1 views
2

J'ai un objet NSArray d'objets, qui a la propriété id. J'ai alors un autre NSArray avec une sélection d'identifiants.Tableau d'objets du test de passage de tableau

J'ai besoin d'obtenir tous les objets du premier tableau dont les identifiants sont listés dans le second tableau.

Est-il possible de le faire sans boucles (bien 1 pour la boucle est ok, mais je voudrais l'éviter). Je sais comment faire avec 2 pour les boucles, mais cela semble très inefficace. Donc, fondamentalement, je cherche le moyen le plus efficace.

(Le Id est un NSURL BTW, donc il ne peut pas être quelque chose entier spécifique)

+0

Même avec de grandes baies, les boucles ne devraient pas prendre beaucoup de temps. Ce qui prend du temps, je suppose, c'est de comparer des objets ... Pourriez-vous être plus précis? –

Répondre

5

Aucune boucle!

NSArray *arrayOfIdentifiers = ...; 
NSArray *arrayOfObjects = ...; 
NSPredicate *filter = [NSPredicate predicateWithFormat:@"id IN %@", arrayOfIdentifier]; 
NSArray *filteredObjects = [arrayOfObjects filteredArrayUsingPredicate:filter]; 

Eh bien, pas de boucles que vous écrivez. Il y a probablement des boucles à l'intérieur de filteredArrayUsingPredicate:.

+0

J'ai pensé que les boucles que j'écris vont être moins efficaces que les boucles d'une méthode existante? Merci :) –

+0

@Jonathan. pas nécessairement ... une boucle 'for' a la même efficacité si vous l'écrivez ou Apple l'écrit. La vraie chose ici est que si Apple a déjà écrit un code qui fait ce dont vous avez besoin, vous n'avez pas besoin de le réécrire. –

+0

Bon point. Btw il y a une double citation errante à la fin de la 3ème ligne. –

2

Vous avez besoin d'un os ensembles d'intersection.

NSMutableSet *set1=[[[NSMutableSet alloc] initWithArray:array1] autorelease]; 
NSMutableSet *set2=[[NSMutableSet alloc] initWithArray:array2]; 
[set1 intersectSet:set2]; 
[set2 release]; 
NSArray *newArray=[set1 allObjects]; 
+0

Désolé de ne pas ajouter Je dois garder la commande. –

Questions connexes