3

假设我有三个可变数组:arr1、arr2 和 arr3。我想将arr1中的所有元素与arr2中的每个元素进行比较,如果arr2中的一个元素包含arr1中的所有元素,我想将它添加到arr3中。所以我认为它看起来像我下面的代码。在 Objective-C 中是否有一些我不知道的智能功能,或者有什么方法可以做到这一点?

for(int i; i < arr2.count; i++)
{
  if([arr2 objectAtIndex:i] containAllElementsInArray:arr1]])
  {
    [arr3 addObject:[arr2 objectAtIndex:i]];
  }
}
4

2 回答 2

8

查看一个数组是否包含另一个数组的所有元素的最佳方法是使用 NSSet。NSSet 将是一组不同对象的静态集合,这意味着当您从数组创建一个集合时,该集合将只包含数组中每个不同对象的 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]];
}
于 2012-04-23T17:47:16.043 回答
2

完成,在 6 行代码中:

NSArray *intersectArray(NSArray *arr1, NSArray *arr2)
{
    NSMutableSet *resultSet = [NSMutableSet setWithArray:arr1];
    [resultSet intersectSet:[NSSet setWithArray:arr2]];

    return [resultSet allObjects];
}

因为NSSet可以直接复制 a 的底层缓冲区NSArray,所以就性能而言,这应该非常有效。

如果您愿意,这也可以很容易地转换为一个类别。

于 2012-04-23T17:39:09.200 回答