20141014补充:
其实正序排列也可以准确输出,以前考虑问题欠思考了,在第一段程序的test.remove(i);后加上一句i--;即可。
-----------------------------------------------------------------------------------------------------------------------------------------------------------
当我们需要处理一个可变长度的数组或是list集合,把不合某个条件的元素去除,但是按照通常的正序进行遍历处理时,发现结果并不像我们预期的那样。例如
@Test
public void test3() {
List<Integer> test=new ArrayList<Integer>();
test.add(4);
test.add(5);
test.add(3);
test.add(2);
test.add(1);
for(int i=0;i<test.size();i++){
System.out.print(test.get(i) + "\t");
}
System.out.println();
for(int i=0;i<test.size();i++){
if(test.get(i)>3){
test.remove(i);
}
}
System.out.println("---------------");
for(int i=0;i<test.size();i++){
System.out.print(test.get(i) + "\t");
}
System.out.println();
}
}
示例中我们的目的是把list集合中大于3的元素剔除,但是运行结果却是
4 5 3 2 1
---------------
5 3 2 1
5这个元素并没有剔除掉,原因在于程序在第一次循环时发现4>3于是把4剔除了,这时5成为了list集合的第一项,而第二次循环时就将其跳过去了,因此没有删除。这时我们就需要打破我们的惯性思维,采取倒序删除
for(int i=test.size()-1;i>=0;i--){
if(test.get(i)>3){
test.remove(i);
}
}
运行结果是
4 5 3 2 1
---------------
3 2 1
这样就可以完成想要的功能了,因为这样倒序处理不会影响前面的元素下标发生变化。