使用自定义对象过滤NSArray

时间:2013-07-04 14:09:05

标签: objective-c nsmutablearray nsarray

我有一个这样的课程:

@interface MyObject : NSObject 
@property (nonatomic, strong) NSString *type;
@end

我正在创建一个这样的数组:

NSMutableArray *array = [NSMutableArray array];
MyObject *obj = [[MyObject alloc] init];
obj.type = @"test1";
[array addObject:obj];

MyObject *obj2 = [[MyObject alloc] init];
obj2.type = @"test2";
[array addObject:obj2];

MyObject *obj3 = [[MyObject alloc] init];
obj3.type = @"test1";
[array addObject:obj3];

我想过滤数组只有只有不同类型的对象,在我的例子中只是为了拥有obj1,obj2并删除obj3。

2 个答案:

答案 0 :(得分:4)

这些方面的东西应该可以解决问题:

NSMutableSet * types = [NSMutableSet setWithCapacity:10];
NSPredicate * filterPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

    if ([types containsObject:[evaluatedObject type]]) {
        return NO;
    }
    else {
        [types addObject:[evaluatedObject type]];
        return YES
    }
}];
NSArray * filteredArray = [detailedError filteredArrayUsingPredicate:filterPredicate];

上面的代码保留了每种类型的第一个对象并删除了其他对象。

答案 1 :(得分:2)

我会通过重写 hash isEqual 来实现这一点:

- (BOOL) isEqual:(id)object
{
    if([object isKindOfClass: [self class]])
        return [_type isEqualToString: object];
    return NO;
}

- (NSInteger) hash
{
    return [_type hash];
}

然后从数组创建的集合中获取distinct objects数组:

NSArray* filteredArray= [NSSet setWithArray: array].allObjects;