我试图使用这种数组清理方法,似乎有一个错误。我无法发现它,我知道阵列有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;
}
答案 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;
}