数组遍历删除元素最佳方法之逆遍历
2017-03-08 本文已影响184人
简简单单写书
可能存在的问题:
如果数组正序遍历过程中,如果删除了某一个元素以后,可能会造成数组越界导致程序崩溃
解决方法:
1、如果只删除一个元素可以使用普通遍历,找到元素直接删除,然后直接break;
2、当删除多个元素时,使用逆序遍历(倒着来)
例如使用OC :
// 逆序遍历,然后查找删除
NSEnumerator *enumerator = [array reverseObjectEnumerator];
//forin遍历
for (AddressPerson *groupName in enumerator) {
if ([[groupName group] isEqualToString:@"Zhangsan"]) {
[array removeObject:groupName];
}
}
正序崩溃原因:
具体情况是这样的,当我们正序遍历时,如果删除了一个,那么没有遍历到的元素位置都会往前移动一位,这样系统就无法确定接下来遍历是从删除位置开始呢,还是从删除位置下一位开始呢?这样就造成程序crash了.对于逆序遍历就不会,因为我们逆序遍历时,遇到匹配的元素删除后,位置改变的是遍历过得元素,而没有遍历到的元素位置却没有改变,所以遍历能够正常进行