Filtering an NSArray with custom objects
本问题已经有最佳答案,请猛点这里访问。
我有一个这样的班级:
1 2 3 | @interface MyObject : NSObject @property (nonatomic, strong) NSString *type; @end |
我正在创建这样的数组:
1 2 3 4 5 6 7 8 9 10 11 12 | 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。
沿着这些线的一些东西应该可以做到这一点:
1 2 3 4 5 6 7 8 9 10 11 12 | 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]; |
上面的代码保留每种类型的第一个对象并删除其他对象。
我只需重写hash和isequal即可做到这一点:
1 2 3 4 5 6 7 8 9 10 11 | - (BOOL) isEqual:(id)object { if([object isKindOfClass: [self class]]) return [_type isEqualToString: object]; return NO; } - (NSInteger) hash { return [_type hash]; } |
然后从数组创建的集合中获取distinct objects数组:
1 | NSArray* filteredArray= [NSSet setWithArray: array].allObjects; |