2010-10-21 16 views
0

Je tente de dé-dupe un NSArray de NSDictionaries basé sur des clés spécifiques dans les dictionnaires. Ce que j'ai ressemble à quelque chose comme ceci:De-dupe NSArray de NSDictionaries basé sur des clés spécifiques

NSDictionary *person1 = [NSDictionary dictionaryWithObjectsAndKeys:@"John", @"firstName", @"Smith", "lastName", @"7898", @"employeeID"]; 
NSDictionary *person2 = [NSDictionary dictionaryWithObjectsAndKeys:@"Eric", @"firstName", @"Johnson", "lastName", @"1718" @"employeeID"]; 
NSDictionary *person3 = [NSDictionary dictionaryWithObjectsAndKeys:@"John", @"firstName", @"Smith", "lastName", @"1153", @"employeeID"]; 

NSMutableArray *personArray = [NSArray arrayWithObjects:person1, person2, person3, nil]; 

// insert some code to de-dupe personArray based SOLELY on the firstName and lastName keys 

Notez comment il y a deux employés avec le même nom mais différents ID. Ce que je voudrais faire, c'est juste récupérer un nouveau tableau avec seulement person1 et person2, puisque person3 a les mêmes données - je ne me soucie pas de la valeur "employeeID" dans ce problème particulier.

Des idées? Merci!

-Matt

Répondre

5

Ajouter une classe Person qui hérite de NSDictionary et implémenter isEqual: en ignorant la clé ID, transtypez vos dictionnaires dans cette classe, puis créez un NSSet à partir de vos objets Person.

0

Dans ce cas précis je voudrais créer un NSMutableDictionary temporaire et ajouter chaque dictionnaire personX comme objet et sa valeur d ' « prenom » comme la clé. De cette façon, un dictionnaire personX sera remplacé si un autre personX avec le même nom est ajouté au temporaire. Ensuite, obtenez le tableau du dictionnaire temporaire avec -allValues ​​.

+0

J'apprécie votre réponse rapide! Je pense que cela fonctionnerait bien dans ce cas, le seul problème, que j'ai oublié de préciser, c'est que j'ai affaire à plusieurs milliers d'objets de la personne. Votre méthode fonctionne, même si je ne suis pas certain de son évolutivité. – mag725

+0

Je peux me tromper, mais il est compris par moi que NSDictionary se comporte la plupart du temps comme carte de hachage, avec temps d'insertion amorti de O (1). Initialiser le dictionnaire avec une capacité proportionnelle au nombre attendu d'entrées uniques pour éviter un ressassement excessif et le tester. La mémoire ne devrait pas non plus poser de problème, car ce que vous insérez est en fait une référence. Si vous avez beaucoup d'entrées et que vous continuez à les récupérer et à les manipuler, peut-être que Core Data répondra mieux à vos besoins. – sigsegv