在 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的主要内容,如果未能解决你的问题,请参考以下文章