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

时间:2013-10-21 20:16:07

标签: ios filter nsmutablearray unique nsorderedset

我有一个内部有NSStrings的NSObject。如何仅将具有唯一obj.name的对象添加到NSMutableArray?我尝试了NSOrderedSet,但它只适用于将NSString添加到数组而不是内部带有NSString的对象。

实施例

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


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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

NSObject Protocol的{​​{3}}谈论覆盖isEqualhash。 关于Stackoverflow的documentation上一个答案详细说明了如何正确实现hashisEqual

在您自己的哈希实现中,您可以使用NSString的{​​{1}}方法。

示例

hash

答案 2 :(得分:-1)

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

if( myDictionary[MyObject.name] == nil )
{
    myDictionary[MyObject.name] = MyObject;
}

比根据您正在执行的添加次数使用常规NSMutableArray更有效。此外,如果您想要访问所有值的数组,您只需要:

NSArray *array = [myDictionary allValues];

NSPredicate的Big-O运行时是O(n),字典方法是O(1)。