在 NSMutableArray 中保留唯一对象的 id

Posted

技术标签:

【中文标题】在 NSMutableArray 中保留唯一对象的 id【英文标题】:keep unique object's id in NSMutableArray 【发布时间】:2019-06-10 13:41:31 【问题描述】:

我有保存排序(时间)对象的 NSMutableArray。 每个对象都有唯一的 URL 字符串 ID。

从性能的角度来看,什么是更好的方法?

    使用filteredArrayUsingPredicate检查对象URL是否已经存在,如果不添加到数组中。 使用 NSMutableDictionary 和 NSMutableArray。每次我添加一个不存在的对象时,我也会将它存储在字典中。 在添加新对象之前,我会检查 NSDictionary 键是否存在对象 ID。

我认为使用 NSDictionary 进行检查更便宜, 但我更愿意了解原因。

这种情况有更好的方法吗? 提前致谢。

【问题讨论】:

【参考方案1】:

您是否考虑过使用 NSMutableSet 来保留唯一的 URL 字符串 ID?

由于您已经将对象存储在排序数组中,因此无需再次将它们存储在字典中。只需将字符串放在一组中即可。使用“包含”检查集合非常快。集合中“包含”的速度应该接近恒定,无论它包含多少项目。

您还可以考虑切换到 NSMutableOrderedSet 而不是完全使用数组。 它会保持项目的唯一性和排序。

您可以在此处查看有关 Collection 类性能的更多信息https://www.objc.io/issues/7-foundation/collections/

【讨论】:

【参考方案2】:

我可以推荐使用 NSOrderedSet (如果您需要订单)NSSet (否则): p>

NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:yourArray];
NSArray *arrayWithoutDuplicates = [orderedSet array];

或者,您可以使用 KeyValueCording 中的运算符:

uniquearray = [yourarray valueForKeyPath:@"@distinctUnionOfObjects.self"];

如果您想按属性删除重复项,例如 name,通过该运算符非常简单:

@distinctUnionOfObjects.name

NSSet 为不同的静态集合声明编程接口 对象。您在创建静态集时建立它的条目,并且 此后无法修改条目。 NSMutableSet,另一方面 手,为不同的动态集合声明一个编程接口 对象。动态(或可变)集允许添加和删除 随时输入,根据需要自动分配内存。

所以,您可以在Apple Docs 中阅读有关 Cocoa Collections 的信息

如果你想将唯一的对象插入到数组中,它会花费 O(1)-O(N),但是如果你想将唯一的对象插入到 Set 中,则需要花费 0(1) 就是瞬间。 阅读复杂性here

对于这种情况,Set 比 Array 快。

【讨论】:

以上是关于在 NSMutableArray 中保留唯一对象的 id的主要内容,如果未能解决你的问题,请参考以下文章

如何将唯一对象添加到 nsmutablearray?

NSMutableArray 如何正确添加对象并释放

在其他功能中保留计数= 0?内存管理问题?

如何在目标c中保留方法之外的数组

替换 2d 嵌套 NSMutableArray 内的对象

按键从 NSMutableArray 中删除对象