防止数组删除元素时发生指针偏移

【Python】删除数组多个元素所产生的问题

#-*-coding:utf-8-*- arr=[1,2,3]; for a in arr: if a<3: arr.remove(a); print arr;
我本来想用数组中自动封装好的remove()方法,删除数组arr中少于3的元素

这个方法删除数组中单个元素是没有任何问题,但是如果想删除arr中,少于3的元素问题就来的。

arr中有三个元素,1,2,3,少于3的元素有2个,删除之后很显然只是剩下[3],我开始也是这样认为,但是运行结果却是[2,3],如下图所示:

原因是这样的:

remove()在删除数组单个元素的时候,删完元素很明显需要把指针位置向前移1位,这就发生如上图所示的指针偏移。

因此需要删除数组中多个元素的时候,绝对不能向上面那样写。

为此,可以用如下的方式结局,进行数组中多个元素删除的时候,先把这个数组复制一个,删的时候,遍历临时数组,删元数组的元素,删完再删除临时数组,这就不会发生因删除而导致的指针偏移了。具体代码如下:

#-*-coding:utf-8-*- arr=[1,2,3]; arr_temp=arr[:]#直接创建一个新的数组arr_temp并将arr的元素倒进来,arr_temp=arr的话,arr_temp仅仅是一个指向arr数组的指针而已。 for a in arr_temp: if a<3: arr.remove(a); del arr_temp; print arr;
运行结果自然也符合我们所想象的一样,最后在arr里面剩余3这个元素!

时间: 2024-08-26 13:44:19

防止数组删除元素时发生指针偏移的相关文章

当JAVA集合移除自身集合元素时发生的诸多问题

一段代码目的是想删除集合中包含"a"字符串的集合项: public class TestForeach { public static void main(String[] args){ //ArrayList<String> lists = new ArrayList<String>(); Collection<String> lists = new HashSet<String>(); lists.add("abvd&quo

js数组 删除元素

一直在使用js相关的东西,但很少作总结,今天遇到操作js数组的一些问题,对js的数组有了更进一步的认识! 1.创建数组var array = new Array();var array = new Array(size);//指定数组的长度var array = new Array(item1,item2……itemN);//创建数组并赋值 2.取值.赋值var item = array[index];//获取指定元素的值array[index] = value;//为指定元素赋值 3.添加新元

Java 集合(List、Set)遍历、判断、删除元素时的小陷阱

开发中,常有场景:遍历集合,依次判断是否符合条件,如符合条件则删除当前元素. 不知不觉中,有些陷阱,不知你有没有犯. 1. 一.漏网之鱼-for循环递增下标方式遍历集合,并删除元素 如果你用for循环递增下标方式遍历集合,在遍历过程中删除元素,你可能会遗漏了某些元素.说那么说可能也说不清楚,看以下示例: import java.util.ArrayList; import java.util.List; public class ListTest_Unwork { public static v

php数组删除元素重新索引的方法

在某个数组中删除一个元素,可以直接用的unset,将缺少的元素会被填补并且数组会被重新索引. 如果要在某个数组中删除一个元素,可以直接用的unset: <?php $arr = array('a','b','c','d'); unset($arr[1]); print_r($arr); ?> print_r($arr)之后,结果却不是那样的,最终结果是 Array ( [0] => a [2] => c [3] => d )那么怎么才能做到缺少的元素会被填补并且数组会被重新索

Java - List遍历、判断、删除元素时的陷阱

开发中,常有“遍历集合,依次判断是否符合条件,如符合条件则删除当前元素”的场景,有一些陷阱常犯. 漏网之鱼 import java.util.ArrayList; import java.util.List; public class ListTest_Unwork { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("1"

Java 数组 之 一维数组 删除 元素

http://www.verejava.com/?id=16992656053526 /* 题目: 删除scores数组索引index位置的值 思路: 1. 创建一个临时比scores 小1的临时数组tempArray 2. 将index前面的数据复制到tempArray前面 3. 将index后面的数组依次复制到 tempArray 后面 4. 将tempArray地址指针引用赋值给 scores 5. 打印输出scores */ import java.util.Scanner; publi

arraylist 为什么 删除元素时要使用迭代器而不能使用遍历

因为你要是遍历了,arraylist 的长度就变了,容易数组越界和下标问题 public class Test {     public static void main(String[] args)  {         ArrayList<Integer> list = new ArrayList<Integer>();         list.add(2);         Iterator<Integer> iterator = list.iterator()

js数组删除元素、json删除元素

//数组var b=[1,2,3,4]; b.splice(b.indexOf(2,1)) //1,3,4 //json var arrayId=[{"id":233,"name":"英语"},{"id":122,"name":"语文"},{"id":10,"name":"数学"}] for(var i=0;i<array

数组删除空缺时的多余逗号

<div style="width:80%;margin:0 auto; border:1px solid #000 ;min-height:600px;"> <ul id="ul"> <li><h4>一</h4><a href="">11</a></li> <li><h4>二</h4><a href=&quo