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

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

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

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

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

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

【问题讨论】:

    标签: ios objective-c macos nsmutablearray nsmutabledictionary


    【解决方案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 快。

      【讨论】:

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