2015-04-01 170 views
0

我有一个NSDictionary数组。每个数组项都有一个名为“Name”的键。现在我想根据此名称值删除重复的条目。distinctUnionOfObjects不区分大小写

这个完美工作:

aMyArray = [aMyArray valueForKeyPath:@"@distinctUnionOfObjects.Name"]; 

的问题是结果阵列仍包含重复串,根据案件。例如:[@“Franck”,“franck”]

如何删除这些重复?

感谢

+0

在过滤出重复元素之前,应用'-lowercaseString'或'capitalizedString'或'uppercaseString'怎么办? – HepaKKes 2015-04-01 22:19:50

+0

因为我需要保留这个案例。 (对于副本,我不在乎哪一个会被删除) – Franck 2015-04-02 00:11:51

+0

好的,如果你不在乎,你总是可以创建一个数组副本并通过UUID检索“原始”对象。如果它太贵,你可以总是使用'NSSet'而不是'NSArray'并且覆盖你的类的'-isEqual'和'-hash'。 – HepaKKes 2015-04-02 00:38:34

回答

0

你可以尝试这样做

// in your class implementation 
- (BOOL)isEqual:(id)object { 
    if (![object isKindOfClass:[self class]]) { 
     return NO; 
    } 
    typeof(self) obj = (typeof(self))object; 
    return ([self.Name caseInsensitiveCompare:obj.Name] == NSOrderedSame); 
} 

- (NSUInteger)hash 
{ 
    return [[self.Name lowercaseString] hash]; 
} 

// and then 
NSSet *distinctObjects = [[NSSet alloc] initWithArray:array]; 
NSArray *result = distinctObjects.allObjects; 

另外,您可以通过交叉混合valueForKeyPath:解析您的自定义DSL,可能与一些清盘像

自定义此 KVC收集运营商
aMyArray = [aMyArray valueForKeyPath:@"@distinctUnionOfObjects[caseInsensitive].Name"]; 

这对我来说似乎不是个好主意,但它肯定是解决您的问题的可行方案。

+1

您的'-hash'方法对于给定的'-isEqual:'方法无效。规则是,如果'-isEqual:'认为两个对象相等,那么'-hash'方法**必须为这两个对象提供相同的散列值。如果这两个名字的大小不同,' - [NSString hash]'可能会给出不同的哈希值,但是'-isEqual:'方法会调用它们相等的值。 – 2015-04-06 00:23:34

+0

糟糕,我忘了在获取哈希之前将'Name's规范化。谢谢 – HepaKKes 2015-04-06 01:32:52