从数组中删除重复项,比较其对象的属性

Joh*_*ith 17 sorting iphone objective-c duplicates duplicate-removal

假设我有一个类Event,它有2个属性:action(NSString)和date(NSDate).

假设我有一个Event对象数组.问题是"日期"属性可以匹配.

我需要删除重复项,这意味着具有相同日期的2个不同对象是重复的.

我可以删除任何字符串或nsdates数组中的重复项,它们很容易比较.但是如何使用复杂对象来处理它们的属性呢?

不要问我到目前为止我做了什么,因为我脑子里唯一想到的就是冒泡,但这是一个新手解决方案,而且很慢.

非常感谢任何帮助(链接,tuts,代码).

提前致谢.

编辑

感谢dasblinkenlight,我制作了一个自定义方法:

- (NSArray *)removeDuplicatesInArray:(NSArray*)arrayToFilter{

    NSMutableSet *seenDates = [NSMutableSet set];
    NSPredicate *dupDatesPred = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind) {
        YourClass *e = (YourClass*)obj;
        BOOL seen = [seenDates containsObject:e.propertyName];
        if (!seen) {
            [seenDates addObject:e.when];
        }
        return !seen;
    }];
    return [arrayToFilter filteredArrayUsingPredicate:dupDatesPred];
} 
Run Code Online (Sandbox Code Playgroud)

YourClass是对象所属类的名称,并且propertyName是要比较的对象的属性.

假设self.arrayWithObjects包含YourClass的对象.

填充后,使用

self.arrayWithObjects = [self removeDuplicatesInArray:self.arrayWithObjects];

你完成了

所有信用到dasblinkenlight.干杯!

das*_*ght 25

您可以创建NSMutableSet日期,迭代事件列表,并仅向事件添加您之前未遇到的日期.

NSMutableSet *seenDates = [NSMutableSet set];
NSPredicate *dupDatesPred = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind) {
    Event *e = (Event*)obj;
    BOOL seen = [seenDates containsObject:e.date];
    if (!seen) {
        [seenDates addObject:e.date];
    }
    return !seen;
}];
NSArray *events = ... // This is your array which needs to be filtered
NSArray *filtered = [events filteredArrayUsingPredicate:dupDatesPred];
Run Code Online (Sandbox Code Playgroud)