阵列清理方法中的错误

时间:2012-11-18 19:09:37

标签: iphone ios xcode nsarray

我试图使用这种数组清理方法,似乎有一个错误。我无法发现它,我知道阵列有3116项,有3116项(我知道有三个副本。

请指教,谢谢!

-(NSArray*) removeDuplicates:(NSArray*)inputArray{
NSMutableArray *arrayToClean = [NSMutableArray arrayWithArray:inputArray];
for (int i =0; i<[arrayToClean count]; i++) {

    for (int j=(i+1); j < [arrayToClean count]; j++) {
        if ([[arrayToClean objectAtIndex:i] isEqual:[arrayToClean
                                                     objectAtIndex:j]]) {
            [arrayToClean removeObjectAtIndex:j];
            j--;

        }

    }
}
NSArray *arrayToReturn = [NSArray arrayWithArray:arrayToClean];
return arrayToReturn;

}

3 个答案:

答案 0 :(得分:2)

NSSet将使这更容易:

-(NSArray *)removeDuplicates:(NSArray *)inputArray {
    NSSet *unique = [NSSet setWithArray:inputArray];

    return [unique allObjects];
}

请注意,套装没有保证订单。如果您需要数组中的对象按特定顺序排列,那么您应该根据需要对生成的数组进行排序。

使用NSSet代替原始数组也可能是合适的,那么您根本不需要担心重复。但这取决于阵列的其他需求。

答案 1 :(得分:1)

嘿你可以使用另一个替代方案。你可以在这里使用NSSet来完成这项任务。

NSSet声明了不同对象的静态集的编程接口 当元素的顺序不重要时,你可以使用集合作为数组的替代,并且在测试集合中是否包含对象时的性能是一个考虑因素 - 当数组被排序时,对成员资格的测试比使用集合测试慢。

您只需要调用以下方法。

-(NSArray *)removeDuplicates:(NSArray *)inputArray {
   NSSet *finalData = [NSSet setWithArray:inputArray];

    return [finalData allObjects];
}

如果真的遇到上述清洁ducplicates方式的任何问题,那么你可以尝试另一种Alterantive。

 -(NSArray *)removeDuplicates:(NSArray *)inputArray {
  NSMutableArray *inputArray1=[NSMutableArray arrayWithArray:inputArray];
  NSMutableArray  *finalARray=[[NSMutableArray alloc]init];
    for (id obj in inputArray1)
   {
    if (![finalARray containsObject:obj])
     {
        [finalARray addObject: obj];

 }
 NSLog(@"new array is %@",finalARray);
 }
 return finalARray;
}

我希望它可以帮助你...

答案 2 :(得分:1)

这是我在之前项目中执行完全相同操作的辅助函数

- (NSMutableArray *)removeDuplicates:(NSMutableArray *)sortedArray{
NSMutableSet* valuesAdded = [NSMutableSet set];
NSMutableArray* filteredArray = [[NSMutableArray alloc] init];
NSString* object;

/* Iterate over the array checking if the value is a member of the set. If its not add it
 * to the set and to the returning array. If the value is already a member, skip over it.
 */
for (object in sortedArray){
    if (![valuesAdded member:object]){
        [valuesAdded addObject:object];
        [filteredArray addObject:object];
    }
}
return filteredArray;
}