让我们说我有三个可变阵列:arr1,arr2和arr3。我想将arr1中的所有元素与arr2中的每个元素进行比较,如果arr2中的元素包含arr1中的所有元素,我想将其添加到arr3。所以我认为它看起来像我下面的代码。在目标中是否存在一些智能功能 - 我不知道,或者以任何方式做到这一点?
for(int i; i < arr2.count; i++)
{
if([arr2 objectAtIndex:i] containAllElementsInArray:arr1]])
{
[arr3 addObject:[arr2 objectAtIndex:i]];
}
}
答案 0 :(得分:8)
查看数组是否包含另一个数组的所有元素的最佳方法是使用NSSets。 NSSet将是不同对象的静态集合,这意味着当您从数组创建集合时,该集合将仅包含数组中每个disctint对象的1个条目。换句话说,一个数组可以有一个对象的多个副本,一个集合只能有一个对象的副本。
使用NSSet的重要部分是能够调用isSubsetOfSet方法:
isSubsetOfSet:返回一个布尔值,指示是否每个 接收集中的对象也存在于另一个给定集合中。
- (BOOL)isSubsetOfSet:(NSSet *)otherSet
您需要从arr1创建一个集合并将其与arr2中的每个元素进行比较,以查看它是否是该元素的子集...
NSSet *arr1set = [NSSet setWithArray:arr1];
NSSet *arr2set = [NSSet setWithArray:[arr2 objectAtIndex:i]];
if ([arr1set isSubsetOfSet:arr2set]) {
// then the element [arr2 objectAtIndex:i] contains all the elements of arr1
[arr3 addObject:[arr2 objectAtIndex:i]];
}
答案 1 :(得分:2)
完成,共6行代码:
NSArray *intersectArray(NSArray *arr1, NSArray *arr2)
{
NSMutableSet *resultSet = [NSMutableSet setWithArray:arr1];
[resultSet intersectSet:[NSSet setWithArray:arr2]];
return [resultSet allObjects];
}
因为NSSet
可以直接复制NSArray
的底层缓冲区,所以这应该是非常有效的,因为性能条款。
如果您愿意,也可以很容易地将其转换为类别。