【问题标题】:Compare all element in one array with other array将一个数组中的所有元素与另一个数组进行比较
【发布时间】:2012-04-23 16:55:39
【问题描述】:

假设我有三个可变数组: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]];
  }
}

【问题讨论】:

  • 也就是说Array3应该包含Array1和Array2的交集吧?
  • 我在你的代码中没有看到arr1。仍在试图弄清楚您是否想要交集或其他行为(即:“如果arr2 中的元素包含arr1 中的所有元素”)
  • 据我了解您在上面发布的逻辑,您有一个 Arr2,其每个元素都包含对象数组。而且,您想明确知道 Arr2 中的各个元素是否包含 Arr1 中的所有对象?也就是说,您只想知道 [Arr2 objectAtIndex:i] 是否包含来自 Arr1 的 5/5 个元素,如果它仅包含您不关心的 4/5 个元素...?
  • @C4-Travis 是的,这正是我想要的。遗憾的是,我不相信提供的其他两种方法会为我做到这一点。
  • 我想我有一个解决方案,只是在努力解决......

标签: objective-c ios xcode loops


【解决方案1】:

查看一个数组是否包含另一个数组的所有元素的最佳方法是使用 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]];
}

【讨论】:

  • 看来这个答案完全符合 OP 的要求。感谢您破译它:D
【解决方案2】:

完成,6 行代码:

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

    return [resultSet allObjects];
}

因为NSSet 可以直接复制NSArray 的底层缓冲区,这在性能方面应该非常有效。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多