首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从数组中删除重复项,比较数组对象的属性

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

Stack Overflow用户
提问于 2012-11-22 01:56:26
回答 6查看 7.3K关注 0票数 19

假设我有一个类事件,它有两个属性: action (NSString)和date (NSDate)。

假设我有一个事件对象数组。问题是"date“属性可以匹配。

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

我可以删除任何字符串数组或nsdate数组中的重复项,它们很容易比较。但是如何处理复杂的对象,它们的属性要在哪里进行比较呢?

不要问我到目前为止我做了什么,因为我脑海中唯一出现的就是泡泡排序,,但它是一个新手解决方案,而且很慢。

非常感谢任何帮助(链接,图示,代码)。

提前谢谢。

编辑

多亏了dasblinkenlight,我做了一个自定义方法:

代码语言:javascript
复制
- (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];
} 

这里,YourClass是对象所属的类名,propertyName是要比较的对象的属性。

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

填充它之后,使用

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

你就完了。

所有的功劳都在闪闪发光。干杯!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-11-22 02:10:12

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

代码语言:javascript
复制
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];
票数 26
EN

Stack Overflow用户

发布于 2012-11-22 06:43:02

这难道不适用于kvc吗?我想下面的解决方案在你的情况下是可行的;

代码语言:javascript
复制
Event *event1 = [[Event alloc] init];
event1.name = @"Event1";
event1.date = [NSDate distantFuture];
Event *event2 = [[Event alloc] init];
event2.name = @"Event2";
event2.date = [NSDate distantPast];
Event *event3 = [[Event alloc] init];
event3.name = @"Event1";
event3.date = [NSDate distantPast];
NSArray *array = @[event1, event2, event3];

NSArray *filteredEvents =  [array valueForKeyPath:@"@distinctUnionOfObjects.name"];
票数 3
EN

Stack Overflow用户

发布于 2016-02-04 10:36:05

代码语言:javascript
复制
NSMutableArray *leftObjects = [duplicateArray mutableCopy];
NSMutableArray *nonDuplicates = [NSMutableArray new];
while (leftObjects.count > 0)
{
    YourClass *object = [leftObjects objectAtIndex:0];

    // find all objects matching your comaprison equality definition for YourClass
    NSArray *matches = [leftObjects filteredArrayUsingPredicate:
                        [NSPredicate predicateWithBlock:^BOOL(YourClass *evaluatedObject, NSDictionary *bindings)
                         {
                             return (evaluatedObject.name == object.name);
                         }] ];
    [leftObjects removeObjectsInArray:matches];

    // add first object (arbitrary, may decide which duplicate to pick)
    [nonDuplicates addObject:matches.firstObject];
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13499231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档