1

我有这样的课:

@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。

4

2 回答 2

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];

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

于 2013-07-04T14:19:52.323 回答
2

我会通过重写hashisEqual来做到这一点:

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

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

然后从从数组创建的集合中获取不同的对象数组:

NSArray* filteredArray= [NSSet setWithArray: array].allObjects;
于 2013-07-04T14:28:14.097 回答