从NSMutableArray中删除重复项

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)


ala*_*air 6

如果你想维持订购,你可以做这样的事情

@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正确实现的方法.