如何将唯一对象添加到 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 谈到了覆盖 isEqual
和 hash
。
This 之前在 *** 上的回答详细说明了如何正确实现 hash
和 isEqual
。
在您自己的哈希实现中,您可以使用NSString
的hash
方法。
示例
- (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?