我在我的数组中有重复,我想摆脱它们,所以我运行这个循环,但它不起作用。谁知道为什么? 该阵列目前有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];
}
}
}
答案 0 :(得分:5)
您的算法只会比较数组中彼此相邻的项目(位置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];
}
}
答案 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:
的第二次调用无效,因为数据已在集合中。