【问题标题】:Filtering an NSArray with custom objects [duplicate]使用自定义对象过滤 NSArray [重复]
【发布时间】:2013-07-02 14:06:19
【问题描述】:

我有这样的课:

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

【问题讨论】:

  • 如果您不介意效率,只需使用嵌套循环删除第二次出现的对象,然后进行排序(但排序与删除具有相同类型的对象关系不大)。跨度>
  • 很抱歉最后一票。我已经快速阅读了你的问题。干杯。
  • 没问题,@flexaddicted :)
  • 如果任何版主可以删除最后一票,这将有所帮助。谢谢

标签: objective-c nsmutablearray nsarray


【解决方案1】:

按照这些思路应该可以解决问题:

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

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

【讨论】:

    【解决方案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;
    

    【讨论】:

    • 尽管这是解决此问题的非常优雅的解决方案,但我认为如果 OP 需要使用 isEqual: 可能会产生副作用:在其他地方,也许 obj1.type == obj2.type 并不总是需要obj1==obj2
    • 这旨在用于像 OP 的 MyObject 这样的类,它只有 type 而没有其他属性。
    猜你喜欢
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多