2015-03-02 64 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]; 
相关问题