2015-04-01 168 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