美文网首页
数组遍历的同时删除元素

数组遍历的同时删除元素

作者: 一抹相思泪成雨 | 来源:发表于2019-11-20 16:35 被阅读0次
NSArray *tempArray = @[@"A",@"A",@"B",@"C",@"D",@"A"];
NSMutableArray *dataArray = [NSMutableArray arrayWithArray:tempArray];

正序遍历

方式一, 使用 for in遍历可变数组的同时删除元素会造成崩溃:
 for (NSString *obj in dataArray) {
        if ([obj isEqualToString:@"A"]) {
            [dataArray removeObject:obj];
        }
  }
方式二, 使用 enumerateObjectsUsingBlock 遍历可变数组的同时删除元素:
   [dataArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"obj ----- %@---index---%ld",obj,idx);
        if ([obj isEqualToString:@"A"]) {
            [dataArray removeObject:obj];
        }
    }];
方式三, 使用 for index 方式遍历可变数组同时删除元素:
 for (int i = 0; i < dataArray.count; i++) {
        NSString *obj = dataArray[i];
       NSLog(@"obj -----%@---index---%d",obj,i);
        if ([obj isEqualToString:@"A"]) {
            [dataArray removeObject:obj];
        }
    }

结论

从上面来看只for in会造成崩溃,其他方式对数组遍历,然后再删除元素就没有问题了。
但是如果删除元素,数组总长度会变化,如果内部再嵌套循环,那么就无法完全遍历

逆序遍历

方式一, 使用 for in遍历可变数组的同时删除元素仍会造成崩溃:(亲测)
 for (NSString *obj in dataArray.reverseObjectEnumerator) {
        if ([obj isEqualToString:@"A"]) {
            [dataArray removeObject:obj];
        }
    }
方式二, enumerateObjectsWithOptions:NSEnumerationReverse
 [dataArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"obj -----%@---index---%ld",obj,idx);
        if ([obj isEqualToString:@"A"]) {
            [dataArray removeObject:obj];
        }
    }];
obj -----A---index---5
obj -----A---index---4
obj -----A---index---3
obj -----D---index---2
obj -----C---index---1
obj -----B---index---0

结论

从上面来看只for in会造成崩溃,enumerateObjectsWithOptions对数组遍历会逆序循环6次,内部元素顺序会发生改变。

总结

1.如果是单循环,那么删除元素,removeObject 会将数组内部相同元素都删除。
2.如果是嵌套循环,那么删除元素,数组长度会发生改变,从而无法完全遍历,建议copy一个数组进行循环删减。也可以使用逆序遍历enumerateObjectsWithOptions:方式

相关文章

  • 87-删除数组元素注意点

    需求: 遍历数组的同时删除数组中所有的元素通过传统遍历数组的方式弊端: 删除不尽元素 let arr = [...

  • 遍历数组的同时删除元素引起崩溃的问题以及解决方案

    遍历数组的同时删除元素引起崩溃的问题 一、问题 使用 for in遍历可变数组的同时删除元素会造成崩溃 崩溃日志为...

  • 数组遍历的同时删除元素

    正序遍历 方式一, 使用 for in遍历可变数组的同时删除元素会造成崩溃: 方式二, 使用 enumerateO...

  • iOS 常用的数据处理

    1. iOS遍历数组的同时删除元素 NSMutableArray*array = [NSMutableArraya...

  • js 数组操作

    遍历删除元素: 遍历数组:for循环遍历: forEach遍历:

  • ios数组

    //枚举遍历和for循环遍历可以在遍历的同时删除里面的元素,但用for in会出现数组越界异常,要想用for in...

  • 数组遍历自身的同时删除元素

    我们在遍历可变数组时,最好不要做删除数组中元素的操作。 因为删除操作可能会引起数组容量的变化,导致数组越界等问题。...

  • iOS遍历数组的同时删除元素

    我们在遍历可变数组时,最好不要做删除数组中元素的操作。因为删除操作可能会引起数组容量的变化,导致数组越界等问题。以...

  • Swift 4.0 数组(Array)学习

    定义数组常量(常量只有读操作) 定义数组变量 赋值 取值 删除元素 添加元素 元素重新赋值 数组遍历

  • Swift学习之数组、集合和字典

    [toc] 数组 初始化一个数组 增加数组元素 读取数组元素 修改数组元素 删除数组元素 数组遍历 集合 集合类型...

网友评论

      本文标题:数组遍历的同时删除元素

      本文链接:https://www.haomeiwen.com/subject/qawoictx.html