比较一个数组中的所有元素与其他数组

时间:2012-04-23 16:55:40

标签: objective-c ios xcode loops

让我们说我有三个可变阵列: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]];
  }
}

2 个答案:

答案 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的底层缓冲区,所以这应该是非常有效的,因为性能条款。

如果您愿意,也可以很容易地将其转换为类别。