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

Posted

技术标签:

【中文标题】如何将唯一对象添加到 nsmutablearray?【英文标题】:How to add unique object to nsmutablearray? 【发布时间】:2013-10-21 20:16:07 【问题描述】:

我有一个 NSObject,里面有 NSStrings。如何将具有唯一 obj.name 的对象仅添加到 NSMutableArray?我试过 NSOrderedSet 但它只有在你将 NSString 添加到数组而不是里面有 NSString 的对象时才有效。

示例。

@@interface MyObject : NSObject
@property (strong, nonatomic) NSString *name;
@end


NSMutableArray *array = MyObject.name,MyObject.name,MyObject.name;

如何确保没有两个 MyObject 具有相同的名称?

【问题讨论】:

【参考方案1】:

使用 NSPredicate 搜索 NSMutableArray 中的对象,如果不存在,则将其添加到 NSMutableArray。 试试这个。

  NSArray * filtered = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name = %@", @"MyObject.name"]];
  if(![array count])
        [array addObject:MyObject ]; 

【讨论】:

你的意思是if(![filtered count]) @Putz1103 它将检查数组中是否存在对象,如果存在则将在上面的代码中过滤数组中的计数【参考方案2】:

所有 NSSet 类都使用 isEqual:hash: 组合来比较相等性。 因为您还没有重新定义这些,所以只需将两个具有相同名称的对象存储在一个集合中是可能的,因为将使用 isEqual:hash: 的 NSObject 实现。

NSObject Protocol 的 documentation 谈到了覆盖 isEqualhash。 This 之前在 *** 上的回答详细说明了如何正确实现 hashisEqual

在您自己的哈希实现中,您可以使用NSStringhash 方法。

示例

- (NSUInteger) hash 
    NSUInteger prime = 31;
    NSUInteger result = 1;

   result = prime * result + [super hash];
   result = prime * result + self.name == nil ? 0 : [self.name hash];

   return result;


- (bool) isEqual:(id)other 
   if (other == self) 
       return YES;
   
   if (!other || ![other isKindOfClass:[self class]]) 
        return NO;
   

   return [self.name isEqualToString:other.name];

【讨论】:

【参考方案3】:

就个人而言,我会使用以 MyObject.name 作为键的 NSMutableDictionary。这样,您所要做的就是:

if( myDictionary[MyObject.name] == nil )

    myDictionary[MyObject.name] = MyObject;

根据您正在执行的添加数量,比使用常规 NSMutableArray 效率更高。另外,如果您想访问包含所有值的数组,您所要做的就是:

NSArray *array = [myDictionary allValues];

NSPredicate 的 Big-O 运行时间为 O(n),其中字典方法为 O(1)。

【讨论】:

问题是关于数组的,所以答案是离题的。如果我们需要通过某个标识符访问对象存储,同时我们需要有对象顺序怎么办? @VyachaslavGerchicov 如果需要排序,可以使用数组和字典。使用字典存储数组中对象的键和索引,使用数组存储有序对象的列表。对于小型数组可能不值得,但如果您正在处理大量项目,那么恒定的查找速度可能是值得的。

以上是关于如何将唯一对象添加到 nsmutablearray?的主要内容,如果未能解决你的问题,请参考以下文章

如何将json数据中的对象添加到nsmutablearray?

在 NSMutableArray 中保留唯一对象的 id

在 NSMutableArray 的特定索引处添加对象

将对象 NSMutableArray 添加到 NSDictionary

将自动释放的对象添加到 NSMutableArray

如何在Objective C中将对象添加到NSMutableArray?