假设我有一个类事件,它有两个属性: action (NSString)和date (NSDate)。
假设我有一个事件对象数组。问题是"date“属性可以匹配。
我需要删除重复项,这意味着具有相同日期的两个不同对象是重复的。
我可以删除任何字符串数组或nsdate数组中的重复项,它们很容易比较。但是如何处理复杂的对象,它们的属性要在哪里进行比较呢?
不要问我到目前为止我做了什么,因为我脑海中唯一出现的就是泡泡排序,,但它是一个新手解决方案,而且很慢。
非常感谢任何帮助(链接,图示,代码)。
提前谢谢。
编辑
多亏了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];
}
这里,YourClass
是对象所属的类名,propertyName
是要比较的对象的属性。
假设self.arrayWithObjects包含YourClass的对象。
填充它之后,使用
self.arrayWithObjects = [self removeDuplicatesInArray:self.arrayWithObjects];
你就完了。
所有的功劳都在闪闪发光。干杯!
发布于 2012-11-22 02:10:12
您可以创建日期的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];
发布于 2012-11-22 06:43:02
这难道不适用于kvc吗?我想下面的解决方案在你的情况下是可行的;
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"];
发布于 2016-02-04 10:36:05
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];
}
https://stackoverflow.com/questions/13499231
复制相似问题