use*_*079 4 cocoa cocoa-touch objective-c nsmutablearray
我有从移动数组中删除重复对象的问题.我已经尝试了这些:
noDuplicates = _personalHistory.personalHistory;
for (int i=[noDuplicates count]-1; i>0; i--) {
if ([noDuplicates indexOfObject: [noDuplicates objectAtIndex: i]]<i)
[noDuplicates removeObjectAtIndex: i];
}
for (PersonalHistory_artikels *e in _personalHistory.personalHistory) {
if (![noDuplicates containsObject:e]) {
NSLog(@"Dubplicates");
[noDuplicates addObject:e];
}
}
for (i=0; i<_personalHistory.personalHistory.count; i++) {
PersonalHistory_artikels *test = [_personalHistory.personalHistory objectAtIndex:i];
for (j=0; j<_personalHistory.personalHistory.count; j++) {
PersonalHistory_artikels *test2 = [_personalHistory.personalHistory objectAtIndex:j];
if (! [test.nieuwsTITLE_personal isEqual:test2.nieuwsTITLE_personal]) {
NSLog(@"Add test = %@", test.nieuwsTITLE_personal);
[noDuplicates addObject:test];
}
}
}
Run Code Online (Sandbox Code Playgroud)
但上面没有一个给我正确的阵列.最后一个是最好的,但它仍显示重复值.有人可以帮我解决这个问题吗?非常感谢你.
Ale*_*ers 37
只需将数组转换为a NSSet并再返回.一个集合不能设计重复.
请注意,集合没有排序顺序.因此,您可以更便宜并放弃订单,或者进行稍微昂贵的操作但保留订单.
NSArray *hasDuplicates = /* (...) */;
NSArray *noDuplicates = [[NSSet setWithArray: hasDuplicates] allObjects];
Run Code Online (Sandbox Code Playgroud)
hat*_*nch 18
在OS X 10.7和iOS 5.0及更高版本中:
newArray = [[NSOrderedSet orderedSetWithArray:oldArray] array];
Run Code Online (Sandbox Code Playgroud)
如果你想维持订购,你可以做这样的事情
@interface NSArray (OrderedDuplicateElimination)
- (NSArray *)arrayByEliminatingDuplicatesMaintainingOrder
{
NSMutableSet *addedObjects = [NSMutableSet set];
NSMutableArray *result = [NSMutableArray array];
for (id obj in self) {
if (![addedObjects containsObject:obj]) {
[result addObject:obj];
[addedObjects addObject:obj];
}
}
return result;
}
@end
Run Code Online (Sandbox Code Playgroud)
该解决方案的计算复杂度低于目前为止提出的大多数其他解决方案; 对于具有M个唯一的N个元素的数组,它应该具有最坏情况复杂度O(N log M),而不是O(N ^ 2).然而,对于短数组,更简单的解决方案可能更快,因为这种方法确实有一些额外的开销.
当然,它确实依赖于你-isEqual:和-hash正确实现的方法.
| 归档时间: |
|
| 查看次数: |
24860 次 |
| 最近记录: |