我有一個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