Objective c NSMutableArray无法删除重复项

Objective c NSMutableArray无法删除重复项,objective-c,xcode,sorting,nsmutablearray,duplicates,Objective C,Xcode,Sorting,Nsmutablearray,Duplicates,我的数组中有重复项,我想去掉它们,所以我运行了这个循环,但是它不起作用。有人知道为什么吗? 该阵列当前有3个项,2个重复项和1个唯一项 for (int x = 0; x <= [array count]; x++) { if(x > 0){ if([[array objectAtIndex:x - 1] isEqualToString:[array objectAtIndex:x]]){ [array removeObjectAtI

我的数组中有重复项,我想去掉它们,所以我运行了这个循环,但是它不起作用。有人知道为什么吗? 该阵列当前有3个项,2个重复项和1个唯一项

 for (int x = 0; x <= [array count]; x++) {
    if(x > 0){
        if([[array objectAtIndex:x - 1] isEqualToString:[array objectAtIndex:x]]){
            [array removeObjectAtIndex:x];
        }
    }
}
for(int x=0;x 0){
if([[array objectAtIndex:x-1]isEqualToString:[array objectAtIndex:x]]){
[array removeObjectAtIndex:x];
}
}
}

您不能在迭代对象的同时对其进行修改。删除对象后,所有对象的索引都会更改。您可以尝试先复制数组并进行迭代,然后在原始数组中进行修改,但您可能仍需要根据您要完成的任务更改某些逻辑。

您的算法只会比较数组中相邻的项(位于位置
x
x-1
的项目)。如果重复项位于任何其他位置,则不会找到它们

解决这个问题最简单的方法是做一个双循环。将数组中的每一项与后面的每一项进行比较。随着数组变大,这将开始花费非常长的时间

正确的方法是让框架处理该操作。将数组转换为一个集合(定义上没有重复项),然后返回到一个数组:

NSSet * s = [NSSet setWithArray:array];
NSArray * dedupedArray = [s allObjects];
如果需要保持顺序,则必须以稍微迂回的方式执行此操作,尽管这仍然比双循环快:

NSMutableSet * itemsSeen = [NSMutableSet set];
NSMutableArray * dedupedArray = [NSMutableArray array];
for( id item in array ){
    if( ![itemsSeen containsObject:item] ){
        [itemsSeen addObject:item];
        [dedupedArray addObject:item];
    }
}

我建议只使用NSSet(或NSMutableSet),它会自动确保每个对象只有一个


但是-请注意,它是每个对象中的一个。它可以有两个不同但具有相同内部值的对象。

如果要确保数组中没有重复项,最好使用
NSMutableSet
而不是
NSMutableArray

NSMutableSet
保持不变,即集合中的每个对象都是唯一的

例如:

NSMutableSet* set = [NSMutableSet set];
NSString* data = @"Data";
[set addObject:data];
[set addObject:data];

addObject:
的第二次调用将不起任何作用,因为数据已经在集合中。

关键区别在于数组是有序的,如果要显示数据(例如在表中),这可能很重要。