[英]How to remove all objects with the same property value but one in NSMutableArray
我有一个带有url字符串属性和标题的历史对象。 我想使用包含搜索字符串的url搜索所有对象的历史记录,然后删除所有重复项。
示例:我有一系列历史记录对象,其中20个都是“ https://www.google.com ”,其中4个是“ https://www.google.com/#q=search ”,我想获得一个数组后面只有一个对象,其网址值为“ https://www.google.com ”,网址值为“ https://www.google.com/#q=search ”
这是我当前的代码,它搜索历史记录并返回与字符串匹配的所有对象:
- (NSArray *)historyObjectsContainingQuery:(NSString *)query {
NSMutableArray *matchingObjects = [[NSMutableArray alloc] init];
HistoryManager *HM = [HistoryManager sharedInstance];
for (int i=0; i<[[HM history] count]; i++) {
//History "days"
HistoryObject *historyItem = HistoryObject([[HistoryManager sharedInstance] history][i]);
for (int o=0; o<[historyItem.objects count]; o++) {
//Each object inn each history day
HistoryObject *HO = HistoryObject(historyItem.objects[o]);
if ([HO.title rangeOfString:query options:NSCaseInsensitiveSearch].location != NSNotFound) {
//history objects with their title containing the query string
[matchingObjects addObject:HO];
}
}
}
return matchingObjects;
}
然后我记录每个网址值:
self.foundInBookmarksAndHistory = [self historyObjectsContainingQuery:textField.text]; for(HistoryObject * HO in self.foundInBookmarksAndHistory){NSLog(@“%@”,HO.url); }
这是结果:
https://www.google.com/
2013-09-15 13:48:49.382 Flow HD[3599:60b] https://www.google.com/
2013-09-15 13:48:49.384 Flow HD[3599:60b] https://www.google.com/
2013-09-15 13:48:49.385 Flow HD[3599:60b] https://www.google.com/
2013-09-15 13:48:49.387 Flow HD[3599:60b] https://www.google.com/
2013-09-15 13:48:49.388 Flow HD[3599:60b] https://www.google.com/
2013-09-15 13:48:49.390 Flow HD[3599:60b] https://www.google.com/
2013-09-15 13:48:49.391 Flow HD[3599:60b] https://www.google.com/search?q=yahoo
2013-09-15 13:48:49.392 Flow HD[3599:60b] https://www.google.com/
2013-09-15 13:48:49.394 Flow HD[3599:60b] https://www.google.com/
2013-09-15 13:48:49.395 Flow HD[3599:60b] https://www.google.com/search?q=Sup
2013-09-15 13:48:49.397 Flow HD[3599:60b] https://www.google.com/
2013-09-15 13:48:49.398 Flow HD[3599:60b] https://www.google.com/
2013-09-15 13:48:49.400 Flow HD[3599:60b] https://www.google.com/
2013-09-15 13:48:49.402 Flow HD[3599:60b] https://www.google.com/
2013-09-15 13:48:49.404 Flow HD[3599:60b] https://www.google.com/
2013-09-15 13:48:49.405 Flow HD[3599:60b] https://www.google.com/
还有很多,我如何删除具有相同值的每个对象? 对象不相等,但确实有相同的URL。
我已经尝试过NSPredicate并使用更多for循环来查找匹配的对象,但我总是留下2个或更多具有相同属性的相同对象。
你可以这样做:
NSMutableSet *seenObjects = [NSMutableSet set];
NSPredicate *dupPred = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind) {
HistoryObject *hObj = (HistoryObject*)obj;
BOOL seen = [seenObjects containsObject:hObj.title];
if (!seen) {
[seenObjects addObject:hObj.title];
}
return !seen;
}];
NSArray *yourHistoryArray = ... // This is your array which needs to be filtered
NSArray *yourHistoryArray = [yourHistoryArray filteredArrayUsingPredicate:dupObjectsPred];
我不确定这是搜索所有对象的最佳方式,但除了我能想到的最简单的修复方法,你的代码就是替换
if ([HO.title rangeOfString:query options:NSCaseInsensitiveSearch].location != NSNotFound) {
[matchingObjects addObject:HO];
}
有了这个:
if ([HO.title rangeOfString:query options:NSCaseInsensitiveSearch].location != NSNotFound) {
HistoryObject *temp = HistoryObject(historyItem.objects[o]);
[historyItem.objects removeObjectAtIndex:o];
}
//And after all the `for` loops
[historyItem.objects addObject:temp];
您删除了所有匹配的对象,并将其添加到阵列一次。
编辑:阅读编辑后,使用isEqualToString
而不是rangeOfString
。 rangeOfString
将在abcd,abce和abcf中找到单词abc,这不是你想要的。 abc的isEqualToString
仅对abc有效,没有别的。
如果对象仍然存在,则循环可变数组(如果需要,将数组更改为可变)
while ([farray containsObject:_data]){
[farray removeObject:_data];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.