3

我有一个里面有 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};

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

4

3 回答 3

5

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

  NSArray * filtered = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name = %@", @"MyObject.name"]];
  if(![array count])
        [array addObject:MyObject ]; 
于 2013-10-21T20:24:52.363 回答
1

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

关于NSObject Protocol覆盖isEqualhash. _ _ 这个hash先前关于 Stackoverflow 的答案详细说明了如何isEqual正确实施。

在您自己的 hash 实现中,您可以使用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];
}
于 2013-10-21T20:28:11.903 回答
0

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

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

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

NSArray *array = [myDictionary allValues];

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

于 2013-10-21T20:36:30.477 回答