在程序开发中for可以说是一个非常非常常出现的东西,特别是在数组里面处理的时候,来看一下for的简单用法
for与for each
我们在使用for时来一个非常常见的代码段
//as3.0
for(var i:uint=0;i<n;i++)
{
trace("i:"i);
}
//java
for(int i=0;i<n;i++)
{
System.out.println("i:"i);
}
在写这里时我们都会说这个用起来很简单嘛,也没什么问题嘛,还讲个屁啊
下面我们来看一个很容易引发的一个错误
来看一段代码
ArrayList<int> arr=new ArrayList<int> ();
arr.add(1);
arr.add(2);
arr.add(3);
arr.add(4);
arr.add(5);
arr.add(6);
arr.add(7);
for(int i=0;i<arr.lenght;i++)
{
System.out.println(arr[i]);
if(i==4)
arr.remove(i);
}
大家看一下这个我们能打印出数组的全部数据吗?
可以吃过亏的就知道这里我们一不小心就改了数组的长度,会导致我们遍历的时候跳过了某个元素。
大家仔细看一下这个遍历过程就能发现问题
这个问题的解决办法也很好解决只要把遍历反过来写就能避免有某些元素遍历不到的情况
ArrayList<int> arr=new ArrayList<int> ();
arr.add(1);
arr.add(2);
arr.add(3);
arr.add(4);
arr.add(5);
arr.add(6);
arr.add(7);
for(int i=arr.lenght-1;i>=0;i--)
{
System.out.println(arr[i]);
if(i==4)
arr.remove(i);
}
可能还有同学会想到用增强的 for循环,这个可以保证遍历所有的元素,而且经过我的测试 这个增强的 for循环不让我们在循环里动态改变这个数组的大小,所以也可以解决这个问题
如果 我们强硬去改变它就会报一个java.util.ConcurrentModificationException的异常错误出来
最近在as3.0遇到了一个更神奇的问题,就是这个东西这个增强for循环支持动态的改变正在遍历的数组长度,出现的问题就是上面的
下面我们来过一下这个错误
代码:
//as3.0
var arr:Array = [1,2,3,4,5] ;
for each (var i:int in arr)
{
trace(i);
if(i==3)
arr.splice(arr.indexOf(1),1);
}
运行结果可想而知:
1
2
3
5
这个跳了一下。没有遍历到全部元素,所以这个要小心了。也可见这个增强for在as3.0里用得是多么的不好。