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

Ios 如何将唯一对象添加到nsmutablearray?,ios,filter,nsmutablearray,unique,nsorderedset,Ios,Filter,Nsmutablearray,Unique,Nsorderedset,我有一个NSObject,里面有NSString。如何将仅具有唯一obj.name的对象添加到NSMutableArray?我尝试了NSOrderedSet,但它只在将NSString添加到数组而不是包含NSString的对象时起作用 例如 @@interface MyObject : NSObject @property (strong, nonatomic) NSString *name; @end NSMutableArray *array = {MyObject.name,MyObj

我有一个NSObject,里面有NSString。如何将仅具有唯一obj.name的对象添加到NSMutableArray?我尝试了NSOrderedSet,但它只在将NSString添加到数组而不是包含NSString的对象时起作用

例如

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


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

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

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

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

所有NSSet类都使用
isEqual:
hash:
组合来比较相等性。 因为您没有重新定义它们,所以可以在一个集合中简单地存储两个同名对象,因为将使用
isEqual:
hash:
的NSObject实现

NSObject协议
的作用是覆盖
isEqual
hash
。 先前关于Stackoverflow的回答详细说明了如何正确实现
哈希
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];
}

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

if( myDictionary[MyObject.name] == nil )
{
    myDictionary[MyObject.name] = MyObject;
}
比根据所做加法的数量使用常规NSMutableArray效率更高。另外,如果要访问包含所有值的数组,只需执行以下操作:

NSArray *array = [myDictionary allValues];

NSPredicate的Big-O运行时是O(n),其中dictionary方法是O(1)。

你的意思是
如果(![filtered count])
?@Putz1103它将检查数组中是否存在对象如果存在,则在上面的代码中过滤数组中会有计数问题是关于数组的,因此答案是意外的。如果我们需要通过某种标识符访问对象存储,同时需要对象顺序,该怎么办?@VyachaslavGerchicov如果需要排序,可以使用数组和字典。使用字典存储数组中对象的键和索引,使用数组存储有序对象的列表。对于小数组来说可能不值得,但是如果您处理的是一个大的项目列表,那么恒定的查找速度可能值得。