从 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 中获取货币总和 [重复]