首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

迭代时从NSMutableArray中删除的最佳方法是什么?

迭代时从NSMutableArray中删除的最佳方法通常是使用以下两种方法之一:

  1. 使用[array enumerateObjectsUsingBlock:]方法迭代数组中的对象,并使用[block removeObjectForKey:]方法来删除其中的对象。例如,如果要将index=2的对象从数组中删除,可以这样定义一个方法:
代码语言:swift
复制
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if (idx == 2) {
        [array removeObjectAtIndex:idx];
    }
    }];
  1. 使用filter函数和firstObject函数来提取第一个匹配对象,然后将剩下的对象添加到一个新数组中。例如,如果要从数组中删除index=2的对象:
代码语言:swift
复制
let result = array.filter{ !($0 == objectAt:[array indexOfObject:objectAt:2]) }
if ![result count] > 0 {
  result.append(objectAt: [array objectAtIndex:2]);
}

这里,objectAt:是在Swift 5中使用的新的语法,它类似于.firstObject.lastObject,并用于更简洁地访问对象。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么Iteratorremove方法可保证源集合安全地删除对象,而在迭代期间不能直接删除集合内元素

https://blog.csdn.net/yanshuanche3765/article/details/78917507 在对集合进行操作,我们会发现,如果我们用迭代迭代,但是在迭代器过程如果使用集合对象去删除...Iterator 支持源集合安全地删除对象,只需在 Iterator 上调用remove()即可。...有些集合不允许在迭代删除或添加元素,但是调用 Iterator remove() 方法是个安全做法。 那么为什么用Iterator删除是安全呢?...=modCount,也就是发现当前版本和迭代器记录版本不一样,那么迭代过程中肯定就会有问题,这时,就会报出之前异常。 那么,我们再来看下为什么用Itr删除就可以安全删除,不会报错呢?...但你可以使用 Iterator 本身方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象同时维护索引一致性。

5.6K31

如何正确遍历删除List元素(普通for循环、增强for循环、迭代器iterator、removeIf+方法引用)

遍历删除List符合条件元素主要有以下几种方法: 普通for循环 2.增强for循环 foreach 3.迭代器iterator 4.removeIf 和 方法引用 (一行代码搞定) 其中使用普通for...要避免这种情况出现则在使用迭代迭代(显式或for-each隐式)不要使用Listremove,改为用Iteratorremove即可。...removeIf 和 方法引用 在JDK1.8,Collection以及其子类新加入了removeIf方法,作用是按照一定规则过滤集合元素。 方法引用是也是JDK1.8新特性之一。...使用removeIf和方法引用删除List符合条件元素: List urls = this.getUrls(); // 使用方法引用删除urls中值为"null"元素 urls.removeIf...("null"::equals); 作为removeIf条件,为true删除元素。

10K41

Objective-C集合类

在Objective-C集合类主要包括不可变数组--NSArray,  可变数组--NSMutableArray,   不可变字典--NSDictionary,    可变字典--NSMutableDictionary...        上面已经写了一种数组遍历方式,下面总结了其他遍历方式,用枚举器(类似Java迭代器)和快速枚举(类似PHPforeach)         (1)枚举器(迭代器)用法                 ...                字典遍历方法是通过字典里-(NSArray *)allKeys获取所有的key存入数组然后通过遍历数组获取key对应value,封装成函数如下: 1 2 3 4...1.不可变集合NSSet     ​    ​    ​    ​(1)NSSet初始化和其他集合类一样也有其对应便利初始化方法和便利构造器,     ​    ​    ​    ​    ​    ​...(void) addObject : (id) object;     ​    ​    ​3.删除集合对象     ​    ​    ​    ​-(void) removeAllObjects

1.1K70

OC知识--Foundation框架详尽总结之『数组类』

NSArray直接使用NSLog()作为字符串输出是小括号括起来形式。...NSArray排序 1.NSArray排序 Foundation自带类排序 使用compare方法对数组元素进行排序, 那么数组元素必须是Foundation框架对象, 也就是说不能是自定义对象.../Walkers/Desktop/test.plist" atomically:YES]; NSLog(@"flag = %i", flag); 输出结果:flag = 1 2.文件读取数据到NSArray...NSMutableArray介绍 NSMutableArray是NSArray子类 NSArray是不可变,一旦初始化完毕后,它里面的内容就永远是固定,不能删除里面的元素,也不能再往里面添加元素...NSMutableArray是可变,数组元素个数未指定并且可以根据需要增长,随时可以往里面添加\更改\删除元素 2.

65840

动态规划数学本质以及通用解法

很多算法或者面试题中都会涉及到:动态规划 问题。 动态规划数学角度来看,就是存在一个有 image.png 个元素集合 image.png 。...这种方法时间复杂度为 image.png ,虽然不是最佳解决方案确是最通用暴力解决方案。 按照上述规则实现通用解法可以按如下步骤(本文用OC语言实现,其他语言可参考): 1....遍历集类所有子集 可以通过递归方法来实现子集遍历,代码如下: /** array:指定要处理集合 start:最开始取元素位置 subArray: 保存遍历得到子集。...*/ void dynamicProgram(NSArray *array, NSInteger start, NSMutableArray *subArray) { //递归调用分别生成集类子集...对每个子集进行条件判断和处理 上述代码中生成了一个通用遍历子集方法

51910

OC学习13——Foundation框架集合

NSArray有一个子类NSMutableArrayNSMutableArray代表集合元素可变集合,因此,程序可以向集合添加新元素,可以删除集合已有的元素。   ...由于NSMutableArray是NSArray子类,所以继承了NSArray所有方法,此外还提供了一系列可以对数组进行修改方法: 添加集合元素方法:这类方法以add开头 删除集合元素方法:...NSSet,重写这个类isEqual:方法和hash方法,应该尽量保证两个对象通过isEqual:方法比较返回YES,他们hash方法返回值也是一样。...当程序NSCountedSet删除一个元素,NSCountedSet只是将该元素对应添加次数减1,只有当该元素添加次数为0,该元素才会真正从NSCountedSet集合删除。...NSDictoinary取出数据,只要给定指定key,就可以取出对应value。

2K80

接口与API设计--18:尽量使用不可变对象

使用属性,可将其声明为“readonly”(默认:readwrite) 比如通过初始化方法传入属性,那么单独声明属性值就可以声明为readonly #import <Foundation/Foundation.h...withPrice:(NSInteger)price; @end 如果想修改数据,且不想让外人知道,通常可以在对象内部分类中将其设置为readwrite #import "Phone.h" //分类重新声明...、set、dictionary等作为公开属性,应该提供相应方法,以此修改对象可变属性 为什么不能直接把phoneArray定义成可变,通过phoneArray来控制?...比如在添加或者删除,Phone对象可能要执行其他相关操作,如果直接底层修改了内部用于存储phoneArray,在Phone对象不知情,直接修改phoneArray可能会让对象间各数据不一致 #import...个有效方法

12710

归并排序

归并操作 归并操作,也叫归并算法,指的是将两个有序序列合并成一个有序序列方法。...自上而下,就是利用递归(或者迭代)将目标序列先拆分成两个小序列,然后对小序列再分别执行归并排序,以此类推直到小序列只有一个元素,然后开始合并小序列。...自下而上,就是直接目标序列,将两个相邻元素两两归并,分别得到归并后序列,再进行两两归并,直到最后只有一个序列,即为排序完成后序列。...: /** 归并排序(自下而上) @param randomNumbers 随机数组 @return 排序后数组 */ + (NSMutableArray *)mergeSort2:(NSMutableArray...// 为了防止越界,high 要去 lo + sz + sz -1 与 count -1较小元素 int high = MIN(lo + sz + sz - 1, count

50150

底牌项目中选择牌谱上传功能--深刻理解UITableView复用

问题: 在选中一张图片后会将该图片存储到一个数组以便上传,可当再次点击按钮取消选中图片时却不知道该如何将该图片数组删除。...解决: 在Cell制定协议设置代理,在选中图片按钮点击事件如果代理响应了协议方法则让代理执行该方法。关键:在该方法要将图片信息传递过去。...可在实现过程遇到了问题就是利用UIImage对象进行比较,发现不同图片有时是相同,现在还不知道是什么原因。...于是放弃该方法,将图片ID(图片唯一标识)传递过来,然后比较两张图片ID,如果相同就将图片数组移除。...然后对图片数组进行遍历,实际上是对图片数组图片ID进行遍历,如果最后添加图片ID和之前添加图片ID相同就将ID相同那张图片以及最后一张图片一起数组删除

1.1K10

@property (copy) NSMutableArray *array; 这个写法会出什么问题

原理: 通过copy方法可以创建可变对象或不可变对象不可变副本,对于不可变副本,其对象值不可以改变。...通过mutableCopy方法可以创建可变对象或不可变对象可变副本,对于可变副本其对象是可变。 复制分为浅复制和深复制两种:浅复制只是复制对象引用,并没有复制对象具体内容。...对于复制Foundation对象,默认并不是深复制,例如copy NSMutableArray对象是浅复制,只是对其引用进行复制;而copy NSMutableString对象是深复制,对原来引用对象具体内容也进行了复制...- { _mArray = mArray.copy; } 你mArray属性就成了NSArray,NSMutableArray只能用strong修饰,不存在有copy修饰情况...如果是strong,直接是赋值_mArray = mArray;右边是什么,左边就是什么,并且是强引用新值。

1.3K60

Objective-C把数组字典数据转换成URL

在表单提交Post方法更多一些,URL传值则会用到Get方法。...在用PHP编程时候肯定会经常拼接url来传参或者请求,在IOS开发中会向服务器通过url请求一些数据,所以对url拼接是少不了,下面不是什么高深技术,只是OC中集合类一个小应用模块,欢迎批评指正...NSMutableArray *arrayURL = [NSMutableArray new];   //存放可变字典数组 NSMutableArray *arrayDic = [NSMutableArray...33 34 35 //数组取出字典,把每个然后拼接成url for (int i = 0; i < arrayDic.count; i ++) {           NSLog(@"对数组第%d...    ​    ​    ​    ​2.对每个字典键值对遍历     ​    ​    ​    ​3.url如果是第一个参数拼接加上?     ​    ​    ​    ​

1.7K100

·FMDB:第三方数据库处理框架·用法示例篇(附源码Demo)

而关于FMDatabaseQueue,官方文档说:如果你想在多线程执行多个查询或更新,你应该使用该类。这是线程安全。 然而,你看完还是不知道FMDatabaseQueue是什么。...其实FMDatabaseQueue这个类对象已经把一个数据库和有关事务操作方法封装在一起了。一个FMDatabaseQueue实例对象里面包含一个FMDatabase数据库对象。...其中,有两种风格,一种在executeUpdate方法后面直接写上字符串字面量语法。另一种在执行方法后面基于SQL字符串初始化一个NSString对象。...和'%@'区别!但对于也仅仅对于SELECT查询操作,可以省掉'%@'两边''噢。DEMO代码也是这样做。...[[DataBase sharedDataBase] addPerson:person];sharedDataBase方法返回一个该类静态实例static DataBase *_DBCtl。

90920

拼图游戏和它AI算法

由此,状态树每一个结点都需要提供以下属性和方法: 父结点引用。要实现从目标状态逆向找回所有经过状态,需要让每一个状态都持有它上一状态引用,即持有它父结点引用。 结点唯一标识。...用于算法过程识别状态等同,以及哈希策略去重。 子结点生成方法。用于衍生出新结点,演进搜索。...所谓路径,就是开始状态到目标状态搜索过程,经过所有状态连起来组成数组。...我们可以搜索结束状态开始,把它放入数组,然后把这个状态父状态放入数组,再把其祖先状态放入数组,直到放入开始状态。如何识别出开始状态呢?当发现某个状态是没有父状态,就说明了它是开始状态。...可用条件 对于拼图游戏来说,已经知道了开始状态(某个乱序状态)和目标状态(图片复原状态),而这两个状态其实是可以互换,完全可以目标复原状态开始搜索,反向推进,直到找出拼图开始乱序状态。

2.4K110

iOS 二级菜单(UITableView实现)「建议收藏」

2 如果有子菜单点一下打开,如果没有,则实现相应操作; 我们来实现他(界面有点丑,但主要是功能,界面很简单自己设计一下就行): 个人想法是这样: 首先建立一个cell类,用于存放cell内容...tableview调用 insertRowsAtIndexPaths: withRowAnimation: 这个函数进行插入操作并且带有动画); 删除操作相同意思先从控制父菜单数组删除,然后同样生成位置数组调用函数删除...) NSMutableArray * TableArry;//要添加进uitableview数组,里面存放是tablecell @property (nonatomic,strong) NSMutableArray...NSArray * array = [self deleteOperation:cell]; if(array.count>0) //视图中删除...addObject:path]; [set addIndex:path.row]; } [_TableArry removeObjectsAtIndexes:set];//调用函数来数组删除

1.1K30

《Objective-C高级编程》温故知新之自动引用计数

毕竟每个阶段对相同东西会有更深刻理解。温故知新! 自动引用计数概念开始 概念:自动引用计数是指内存管理对内存管理对引用采取自动计数计数。...比如NSMutableArray array类方法 id obj = [NSMutableArray array]; //取得对象存在,但自己不持有对象 使用retain可持有对象 [obj...class_createInstance 函数源码可以通过obj4库源码进行确认 源代码函数来看,苹果实现大概就是采用散列表(引用计数表)来管理引用计数。...书原文中写道:在声明类成员变量,如果同属性声明属性不一致则会引起编译错误。...如果第二参数为0,则将变量地址weak 表 weak 表删除。 weak 表与引用计数表相同,作为散列表被实现。如果大量使用附有 __weak 修饰符变量,则会消耗相应 CPU 资源。

59750

iOS_Runtime是什么?原理?作用?怎么实现weak?使用

就是在程序运行过程,有一套C语言级别的API,它把代码OC转换成C 2、原理: OC是基于C,并添加了面向对象特性,将很多静态语言在编译和链接事放到了runtime运行时来处理 C:函数调用在编译就知道会调用哪个函数...(我有在一次面试遇到) Runtime对注册类会进行布局,对于weak对象会放入一个hash表,用weak指向`对象内存地址`作为key。...当对象引用计数为0会调用dealloc方法,此时会在weak表搜索,将所有weak对象置为nil。...Key:对象内存地址 — value:n个weak对象 5、使用 替换ViewController生命周期方法 解决获取索引、添加、删除元素越界crash问题 防止按钮重复暴力点击 全局更换控件初始效果...``Category`里拦截增删改方法,进行判空处理 (其他NSArray、NSDictionary、NSMutableArray、NSMutableDictionary等也可以做相应处理,防止越界

34020

oc深坑測试题及其答案

C、release能够减小对象引用计数,但autorelease不能够 D、dealloc方法不能直接调用 45、 以下程序段输出结果是什么NSMutableArray * arr1...B、一个对象在引用计数变为0,会调用自己dealloc方法 C、在dealloc方法里。...B、在要求确认协议类必须实现协议方法,能够使用@required。 C、一个协议能够被多个类确认。 D、协议声明方法。默认是@optional。...答案:(D) A、没有getter方法,当对calvalue赋值,将产生一个NSString副本。 B、此属性可保证多线程安全。 C、此属性在合成能够生成设置器方法。...答案:(C) A、1 B、0 C、整型最大值 D、2 73、 NSMutableDictionary字典删除对象能够使用以下那个方法: 答案:(D) A、filteredArrayUsingPredicate

40030

iOS TableView多级列表

那么,我们就用树形结构结点(Node)来作为存储和关联数据模型(NodeModel)。...展开或合并: 通过插入或删除cell方式来实现。(示例数据都是假数据,随机生成。)...插入和删除位置以及范围可通过点击结点位置、层级、子结点ID(当前结点ID)与子结点层级或父节点相比较来确定。可以的话,做一下缓存处理,优化不分大小,点滴做起。...(示例demo效果是只更新当前结点下所有展开子结点选中状态,因为子结点数据是边展开边获取,合并起来数据没有保存。)...选中位置以及范围可通过点击结点位置、层级、子结点ID(当前结点ID)与子结点层级或父节点相比较来确定。可以的话,做一下缓存处理,优化不分大小,点滴做起。

2.2K30

Objective—C语言新魅力——Nullability、泛型集合与类型延拓

:set方法可以为nil,get方法不可返回nil 一点提示: 你可以发现,iOS9SDK已经完全兼容使用了这些特性,并且nonnull使用会比nullable广泛多,因此,系统提供了这样一对宏...在开发如下使用,做到提示伙伴我这个数组是什么东西作用: @interface ViewController () {     NSArray __TYPE__FIT_TO__CLASS(NSString...所以,当我看到Xcode7集合类型,我着实兴奋了一下。...激动吧,使用点语法可以访问到数组泛型方法了,还有更加诱人: ? 在我们向这个数组追加元素时候,编译器将元素类型提示了出来,并且将FromArray方法需要元素类型也提示了出来。...控件,viewWithTag方法通常会返回给我们一个UIView类型指针,这就需要开发者手动强转一下,十分麻烦。

98130
领券