我有一个NSDictionary数组。每个数组项都有一个名为“Name”的键。现在我想根据此名称值删除重复的条目。distinctUnionOfObjects不区分大小写
这个完美工作:
aMyArray = [aMyArray valueForKeyPath:@"@distinctUnionOfObjects.Name"];
的问题是结果阵列仍包含重复串,根据案件。例如:[@“Franck”,“franck”]
如何删除这些重复?
感谢
我有一个NSDictionary数组。每个数组项都有一个名为“Name”的键。现在我想根据此名称值删除重复的条目。distinctUnionOfObjects不区分大小写
这个完美工作:
aMyArray = [aMyArray valueForKeyPath:@"@distinctUnionOfObjects.Name"];
的问题是结果阵列仍包含重复串,根据案件。例如:[@“Franck”,“franck”]
如何删除这些重复?
感谢
你可以尝试这样做
// 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
,可能与一些清盘像
aMyArray = [aMyArray valueForKeyPath:@"@distinctUnionOfObjects[caseInsensitive].Name"];
这对我来说似乎不是个好主意,但它肯定是解决您的问题的可行方案。
您的'-hash'方法对于给定的'-isEqual:'方法无效。规则是,如果'-isEqual:'认为两个对象相等,那么'-hash'方法**必须为这两个对象提供相同的散列值。如果这两个名字的大小不同,' - [NSString hash]'可能会给出不同的哈希值,但是'-isEqual:'方法会调用它们相等的值。 – 2015-04-06 00:23:34
糟糕,我忘了在获取哈希之前将'Name's规范化。谢谢 – HepaKKes 2015-04-06 01:32:52
在过滤出重复元素之前,应用'-lowercaseString'或'capitalizedString'或'uppercaseString'怎么办? – HepaKKes 2015-04-01 22:19:50
因为我需要保留这个案例。 (对于副本,我不在乎哪一个会被删除) – Franck 2015-04-02 00:11:51
好的,如果你不在乎,你总是可以创建一个数组副本并通过UUID检索“原始”对象。如果它太贵,你可以总是使用'NSSet'而不是'NSArray'并且覆盖你的类的'-isEqual'和'-hash'。 – HepaKKes 2015-04-02 00:38:34