从 NSMutableArray 中删除重复的自定义对象,确保保留最新的重复对象

Posted

技术标签:

【中文标题】从 NSMutableArray 中删除重复的自定义对象,确保保留最新的重复对象【英文标题】:Remove Duplicate custom objects from NSMutable Array making sure to keep newest duplicate object 【发布时间】:2016-05-12 21:23:10 【问题描述】:

我有一个NSMutableArray 的自定义对象。每个都包含一个唯一的 ID 字符串,每个都包含一个 downloadedDate 属性。

对象可能会被添加两次,因此我需要检查 ID 是否有重复项,如果发现重复项,我需要保留日期最新的那个。

目前我正在执行以下操作来删除重复项,但它没有考虑使对象保持最新日期。

NSArray *originalArray = [NSArray arrayWithArray:mutableItems];
NSMutableArray *uniqueArray = [NSMutableArray array];
NSMutableSet *names = [NSMutableSet set];
for (ZSSObject *g in originalArray) 
    NSString *destinationName = g.code;
    if (![names containsObject:destinationName]) 
        [uniqueArray addObject:g];
        [names addObject:destinationName];
    

NSArray *uniqueObjects = uniqueArray;

对象是这样创建的:

ZSSObject *obj = [ZSSObject alloc] init];
obj.code = @"12345";
obj.downloadedDate = [NSDate date];

有没有比拥有一堆数组副本和嵌套循环更简单的方法?

【问题讨论】:

听起来你应该使用字典而不是数组。然后您可以在将新对象添加到字典之前检查日期。 在循环之前根据降序对 originalArray 进行排序将解决您的问题。 @Paulw11 - 我刚刚发布了一个答案,如果这是你的想法,请告诉我。 【参考方案1】:

使用NSDictionary 的建议,我想出了这个解决方案:

NSMutableDictionary *objDict = [[NSMutableDictionary alloc] init];
for (ZSSObject *g in mutableItems) 

    ZSSObject *addedObj = objDict[g.code];

    if (addedObj) 

        // Compare dates
        if ([addedObj respondsToSelector:@selector(dateDownloaded)]) 

            if ([g.dateDownloaded compare:addedObj.dateDownloaded] == NSOrderedDescending) 

                [objDict setObject:g forKey:g.code];

            

        

     else 
        [objDict setObject:g forKey:g.code];
    


NSArray *uniqueObj = objDict.allValues;

【讨论】:

是的,我会这样做

以上是关于从 NSMutableArray 中删除重复的自定义对象,确保保留最新的重复对象的主要内容,如果未能解决你的问题,请参考以下文章

从 PLIST 中的 NSMutableArray 中删除项目

如何从 NSMutableArray 中获取货币总和 [重复]

按键从 NSMutableArray 中删除对象

从数组中删除(不准确)NSDictionaries 的重复项

从 NSmutableArray 中删除项目

从 NSMutableArray 中删除对象时崩溃