【问题标题】:If any element in setA is in setB如果 setA 中的任何元素在 setB 中
【发布时间】:2013-02-07 21:16:14
【问题描述】:

关于 Obj-c 中的集合的快速问题。给定两组:

NSMutableSet* a = [NSMutableSet setWithObjects: 1, 2, 3, nil];
NSMutableSet* b = [NSMutableSet setWithObjects: 3, 4, 5, nil];

有没有一种快速简便的方法来确定集合 A 中的任何元素是否也在集合 B 中?

类似...

if ([a contains:[b allObjects]])
   // do something

【问题讨论】:

  • 也就是说,交叉点是非空的吗?

标签: objective-c nsset nsmutableset


【解决方案1】:

这就是-intersectsSet: 的用途。

if ([a intersectsSet:b])
    // do something

【讨论】:

  • 好的。所以稍后在我的程序中,当我想从另一个集合中删除一个集合的所有元素时,我应该怎么做?
  • @Clever:创建一个包含您的“主”集的NSMutableSet,并调用-minusSet:,传入您要删除的集。
  • 谢谢凯文。再快一点--- 与 NSMutableArray 相比,我从使用集合中获得了什么样的效率提升?在我进入大量对象之前,我认为这并不重要?
  • @Clever:取决于你在做什么。集合是一个无序集合,它具有摊销的常量时间访问/变异,就像字典一样(因为它们都由哈希表支持)。数组是一个有序集合,可以对单个元素进行恒定时间访问,但插入/删除可能是线性的(尽管在数组的前后进行了优化)。所以这真的取决于你需要什么。
  • @Clever:从根本上说,如果您需要有序容器,请使用数组。如果您需要无序容器,请使用集合。请注意,集合也是唯一的,与数组不同,因此如果您不想要该属性,那么就不要使用集合。
【解决方案2】:

你要找的词是“相交”:)

if ([a intersectsSet:b]) {
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2018-08-20
    • 2014-02-12
    • 2020-01-03
    相关资源
    最近更新 更多