NSMutableArray无法删除重复项

时间:2012-01-28 20:56:02

标签: 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 removeObjectAtIndex:x];
        }
    }
}

4 个答案:

答案 0 :(得分:5)

您的算法只会比较数组中彼此相邻的项目(位置xx-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];
    }
}

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

但是 - 注意它是每个OBJECT之一。它可以有2个不同但内部值相同的对象。

答案 3 :(得分:0)

如果您想确保阵列中没有重复项,最好使用NSMutableSet而不是NSMutableArray

NSMutableSet维护集合中每个对象都是唯一的不变量。

例如:

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

addObject:的第二次调用无效,因为数据已在集合中。