0

我正在尝试使用这种阵列清理方法,似乎有错误。我无法发现它,我知道该数组包含 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;

}

4

3 回答 3

2

NSSet 将使这更容易:

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

    return [unique allObjects];
}

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

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

于 2012-11-18T19:27:21.980 回答
1

嘿,您可以为此使用另一种选择。您可以使用NSSet此处来执行此任务。

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

你只需要调用下面的方法。

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

    return [finalData allObjects];
}

如果确实在上述清洁重复项的方式中遇到任何问题,那么您可以尝试另一种替代方法。

 -(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;
}

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

于 2012-11-18T20:04:27.880 回答
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;
}
于 2012-11-18T20:18:29.800 回答