在NSMutableArray中保留唯一对象的ID

时间:2019-06-10 13:41:31

标签: ios objective-c macos nsmutablearray nsmutabledictionary

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

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

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

我认为使用NSDictionary进行检查的成本较低, 但我更愿意理解为什么。

在这种情况下是否有更好的方法? 预先感谢。

2 个答案:

答案 0 :(得分:0)

我可以建议使用 NSOrderedSet (如果需要订购) NSSet (否则)

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

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

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

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

@distinctUnionOfObjects.name
  

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

因此,您可以在Apple Docs

中阅读有关可可收藏的信息。

如果您要将唯一对象插入Array,则费用为 O(1)-O(N),但是如果您想将唯一对象插入到Set,则费用为 0(1) 立即生效。 了解复杂性here

在这种情况下,设置速度要比Array快。

答案 1 :(得分:0)

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

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

您还可以考虑切换到NSMutableOrderedSet而不是全部切换到Array。 它将使项目保持唯一性和排序性。

您可以在https://www.objc.io/issues/7-foundation/collections/

上了解有关Collection类性能的更多信息
相关问题