40 votes

Recherche d'intersection de NSMutableArrays

J'ai trois NSMutableArray contenant des noms qui sont ajoutés aux listes en fonction de différents critères.

Voici mon pseudo-code de tableaux:

 NSMutableArray *array1 = [@"Jack", @"John", @"Daniel", @"Lisa"];
NSMutableArray *array2 = [@"Jack", @"Bryan", @"Barney", @"Lisa",@"Penelope",@"Angelica"];
NSMutableArray *array3 = [@"Jack", @"Jerome", @"Dan", @"Lindsay", @"Lisa"];
 

Je veux trouver un quatrième tableau qui inclut l'intersection de ces trois tableaux. Dans ce cas par exemple ce sera:

 NSMutableArray *array4 = [@"Jack",@"Lisa"];
 

Parce que tous les trois tableaux ont jack et lisa en tant qu'élément. Y a-t-il moyen de faire cela simplement?

74voto

Dave DeLong Points 156978

Utilisez NSMutableSet :

 NSMutableSet *intersection = [NSMutableSet setWithArray:array1];
[intersection intersectSet:[NSSet setWithArray:array2]];
[intersection intersectSet:[NSSet setWithArray:array3]];

NSArray *array4 = [intersection allObjects];
 

Le seul problème avec ceci est que vous perdez l'ordre des éléments, mais je pense (dans ce cas) que c'est OK.


Comme cela a été souligné dans les commentaires (merci, Q80 !), IOS 5 et OS X 10.7 ont ajouté une nouvelle classe appelée NSOrderedSet (avec une sous-classe Mutable ) qui vous permet d'effectuer ces mêmes opérations d'intersection tout en maintenant l'ordre.

12voto

Shmidt Points 5549

Très bon tutoriel sur les intersections utilisant des prédicats

Intersections et différences de tableaux

2voto

sergio Points 52422

Regardez ce post .

En bref: si vous pouvez utiliser NSSet au lieu de NSArray, c'est trivial (NSMutableSet a intersectSet: ).

Sinon, vous pouvez créer un NSSet à partir de votre NSArray et revenir au cas ci-dessus.

1voto

 NSMutableArray *first = [[NSMutableArray alloc] initWithObjects:@"Jack", @"John", @"Daniel", @"Lisa",nil];

NSMutableArray *seconds =[[NSMutableArray alloc] initWithObjects:@"Jack", @"Bryan", @"Barney", @"Lisa",@"Penelope",@"Angelica",nil];

NSMutableArray *third = [ [ NSMutableArray alloc]init];


for (id obj in first) {

    if ([seconds  containsObject:obj] ) {


        [third addObject:obj];

    }


}


NSLog(@"third is : %@ \n\n",third);
 

SORTIE:

le troisième est: (

 Jack,

Lisa
 

)

-1voto

Boris Elenin Points 1

Voici une variante de travail des liens ci-dessus

 NSPredicate *intersectPredicate = [NSPredicate predicateWithFormat:@"SELF IN %@", @[@500, @400, @600]];
NSArray *intersect = [@[@200, @300, @400] filteredArrayUsingPredicate:intersectPredicate];
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X