2015-03-02 75 views
-1

我有此對象的數組:NSArray - 如何基於兩個屬性匹配到同一數組中的另一個對象來過濾數組?

NSString *pageNumber; 
NSInteger index; 
NSString *textValue; 
NSString *bookmark; 
NSString *GUID; 

我想刪除具有相同textValueindex值重複的對象。它不應該看其他屬性,但只有這兩個。

編輯:另外,要保持會話期間的值相同,我想只選擇較低的2種相同條目的GUID。

我以前使用過distinctUnionOfObjects,但它只能幫助我,如果我需要過濾一個屬性的重複。

我想到的另一種創造性的方式是在數組中創建另一個屬性,這兩個屬性的組合都是這兩個屬性的組合,然後對它們執行distinctUnionOfObjects,但它看起來很髒並且是黑客。

什麼是最簡單和最有效的方法來實現這一目標?

+2

你看過'NSPredicate'嗎? 'NSArray'有一個方法可以讓你使用謂詞,他們應該讓你做你想做的。 – Pripyat 2015-03-02 22:04:43

回答

4

如果您在對象上實現了isEqual:hash,它將自動不允許在NSSet中重複對象。您可以通過使用NSOrderedSet來保留對象的順序。

@implementation YourClass 
- (BOOL)isEqual:(id)other { 
    if (!([self class] == [other class])) 
    return NO; 
    YourClass *element = other; 
    if (self.index != element.index) return NO; 
    if (![self.textValue isEqualToString:element.textValue]) return NO; 
    return YES; 
} 

- (NSUInteger)hash { 
    NSUInteger prime = 31; 
    NSUInteger hash = [[self class] hash]; 
    hash = hash * prime + self.index; 
    hash = hash * prime + (NSUInteger)([self.textValue hash]^([self.textValue hash] >> 32)); 
    return hash; 
} 
@end 

uniqueObjects = [NSOrderedSet orderedSetWithArray:allObjects];