查找NSMutableArrays的交集

aec*_*tci 40 iphone intersection nsmutablearray

我有三个NSMutableArray包含根据不同的标准添加到列表中的名称.

这是我的数组伪代码:

NSMutableArray *array1 = [@"Jack", @"John", @"Daniel", @"Lisa"];
NSMutableArray *array2 = [@"Jack", @"Bryan", @"Barney", @"Lisa",@"Penelope",@"Angelica"];
NSMutableArray *array3 = [@"Jack", @"Jerome", @"Dan", @"Lindsay", @"Lisa"];
Run Code Online (Sandbox Code Playgroud)

我想找到第四个数组,其中包括这三个数组的交集.在这种情况下,例如它将是:

NSMutableArray *array4 = [@"Jack",@"Lisa"];
Run Code Online (Sandbox Code Playgroud)

因为所有三个阵列都有jack和lisa作为元素.有没有办法简单地这样做?

Dav*_*ong 74

用途NSMutableSet:

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

NSArray *array4 = [intersection allObjects];
Run Code Online (Sandbox Code Playgroud)

唯一的问题是你丢失了元素的排序,但我认为(在这种情况下)那没关系.


正如评论中指出的那样(感谢Q80!),iOS 5和OS X 10.7添加了一个名为NSOrderedSet(Mutable带子类)的新类,它允许您在保持顺序的同时执行这些相同的交集操作.

  • 如果要保留顺序,请使用`NSMutableOrderedSet`.类似于:`NSMutableOrderedSet*ordered = [NSMutableOrderedSet orderedSetWithArray:array1];`.然后交叉等等. (3认同)
  • 只要数组本身不包含重复项((array1 = [obj1,obj2,obj2,obj3]`和`array2 = [obj2,obj2,obj3,obj4]`的交叉应该是`intersect = [obj2,obj2,obj3]`).如果数组包含重复项或排序很重要,那么最好使用谓词过滤数组. (2认同)