Ios NSArray-如何根据与同一数组中另一个对象匹配的两个属性筛选数组?
我有一个这个对象的数组:Ios NSArray-如何根据与同一数组中另一个对象匹配的两个属性筛选数组?,ios,objective-c,cocoa-touch,nsmutablearray,nsarray,Ios,Objective C,Cocoa Touch,Nsmutablearray,Nsarray,我有一个这个对象的数组: NSString *pageNumber; NSInteger index; NSString *textValue; NSString *bookmark; NSString *GUID; 我想删除具有相同textValue和index值的重复对象。它不应该看其他属性,而应该只看这两个属性 编辑:另外,为了在会话期间保持值不变,我只想为两个相同的条目选择排序中较低的GUID 我以前使用过distinctUnionOfObjects,但它只能在我需要按一个属性过滤重复
NSString *pageNumber;
NSInteger index;
NSString *textValue;
NSString *bookmark;
NSString *GUID;
我想删除具有相同textValue
和index
值的重复对象。它不应该看其他属性,而应该只看这两个属性
编辑:另外,为了在会话期间保持值不变,我只想为两个相同的条目选择排序中较低的GUID
我以前使用过distinctUnionOfObjects
,但它只能在我需要按一个属性过滤重复项时帮助我
我想到的另一个创造性的方法是在数组中创建另一个属性,它是这两个属性的组合,然后对它们执行distinctUnionOfObjects
,但这似乎是肮脏的和黑客行为
实现这一点最简单、最有效的方法是什么?如果在对象上实现
isEqual:
和哈希
,它将自动不允许在NSSet
中重复对象。通过使用传感器数据集
,可以保持对象的顺序
@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];
您是否查看过预测
NSArray
有一个方法可以让你使用谓词,它们应该让你做你想做的事情。