如何将唯一对象添加到NSMutableArray中?

3

我有一个包含NSString的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个回答

5

使用NSPredicate在NSMutableArray中搜索对象,如果不存在,则将其添加到NSMutableArray中。可以尝试以下内容。

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

你的意思是 if(![filtered count]) 吗? - Putz1103
@Putz1103,它将检查数组中对象的存在性,如果存在,则在上述代码中过滤数组中会有计数。 - Rocker

1
所有的NSSet类都使用isEqual:和hash:结合起来比较相等性。 因为你没有重新定义这些方法,所以在集合中存储两个具有相同名称的对象是可能的,因为NSObject实现的isEqual:和hash:将被使用。
NSObject协议的文档讲解了如何重写isEqual和hash。 Stackoverflow上的这个先前的答案详细说明了如何正确实现hash和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];
}

0

个人而言,我会使用NSMutableDictionary,以MyObject.name作为键。这样你只需要做这个:

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

如果你要执行很多添加操作,那么使用一个基于NSMutableArray的正常数组会比较低效。此外,如果你想要获取所有值的数组,只需要执行以下操作:

NSArray *array = [myDictionary allValues];

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接