// To find objects by indexes- (ID)objectAtIndex:(NSUInteger)index- (NSArray *)objectsAtIndexes:(NSIndexSet *)indexes// To find index by object- (NSUInteger)indexOfObject:(ID)anObject
但是,我想为给定的对象获取NSIndexSet(多个索引).就像是:
- (NSIndexSet *)indexesOfObjects:(NSArray *)objects
NSArray不存在此方法.我错过了什么吗?有人知道另一种标准方法吗?否则我必须将其写为类别方法.
解决方法 使用set来指定要查找的对象可能很有用,例如:- (NSIndexSet *) indicesOfObjectsInSet: (NSSet *) set{ if ( [set count] == 0 ) return ( [NSIndexSet indexSet] ); NSMutableIndexSet * indices = [NSMutableIndexSet indexSet]; NSUInteger index = 0; for ( ID obj in self ) { if ( [set containsObject: obj] ) [indices addindex: index]; index++; } return ( [[indices copy] autorelease] );}
这需要访问数组中的每个对象,但至少只执行一次,并在执行此 *** 作时使用快速枚举.使用NSSet并针对该集测试数组中的每个对象也比测试包含在数组中要快得多.
这里有一个潜在的优化,但是在单个对象多次存储在接收数组中的情况下它会破裂:
if ( [set containsObject: obj] ){ [indices addindex: index]; if ( [indices count] == [set count] ) break;}
这样,如果您正在为两个对象扫描一个20’000项目的数组并且它们都在前十个内部,那么您将能够避免扫描阵列中的其他19’990个对象.正如我所说,如果数组包含重复项,那就无济于事,因为它会在找到2个索引后立即停止(即使它们都指向同一个对象).
话虽如此,我同意迈克上面的评论.你有可能让自己陷入困境来优化时间.可能值得考虑不同的数据类型;例如,虽然NSArray似乎是简单扁平容器最合理的选择,但如果您实际上不需要订购信息,最好使用NSSet;这有一个额外的好处,它不会存储相同的对象(使用-isEqual :)计算两次.如果你想跟踪重复项,但不需要排序,可以使用NSCountedSet,它表现为NSSet,除了它跟踪每个对象的添加/删除次数,而不实际存储重复项.
总结以上是内存溢出为你收集整理的cocoa – 从NSArray获取NSIndexSet全部内容,希望文章能够帮你解决cocoa – 从NSArray获取NSIndexSet所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)