JAVA基础--ArrayList删除的问题,java基础--arraylist
分享于 点击 8381 次 点评:21
JAVA基础--ArrayList删除的问题,java基础--arraylist
前几日遇到一个问题,在过滤数据时,当ArrayList中的一个元素符合某个条件时就要把这个元素删掉,但是最后结果检测的时候,总是发现少删了大概一半。在网上一查才知道原因。先看以下简单的模拟代码:
public class ListRemove {
/**
* @param args
*/
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(5);
arrayList.add(4);
arrayList.add(6);
arrayList.add(9);
ListRemove l = new ListRemove();
System.out.println("删除前打印如下:");
l.printArrayList(arrayList);
//循环删除元素
// l.deleteEven(arrayList);
// System.out.println("循环删除偶数后打印如下:");
// l.printArrayList(arrayList);
//遍历删除元素
l.removeByIterate(arrayList);
System.out.println("遍历删除偶数后打印如下:");
l.printArrayList(arrayList);
}
//循环删除偶数
public void deleteEven(ArrayList<Integer> a){
for(int i=0;i<a.size();i++){
if(a.get(i)%2==0){
a.remove(i);
}
}
}
//利用遍历删除偶数元素
public void removeByIterate(ArrayList<Integer> a){
Iterator<Integer> array = a.iterator();
int i=0;
while(array.hasNext()){
if(i>=a.size()){//避免获取元素时下标溢出
break;
}else if(a.get(i)%2==0){
a.remove(i);
}
i++;
}
}
//打印arrayList
public void printArrayList(ArrayList<Integer> a){
for(int i=0;i<a.size();i++){
System.out.print(a.get(i));
if(i!=a.size()-1){
System.out.print(",");
}
}
System.out.println();
}
}
运行后会发现结果如下:
删除前打印如下:
1,2,3,5,4,6,9
循环删除偶数后打印如下:
1,3,5,6,9
删除前打印如下:
1,2,3,5,4,6,9
遍历删除偶数后打印如下:
1,3,5,6,9
为什么arrayList 中 6 这个偶数没有被删除掉。
原因在于删除的同时,arrayList的size发生了变化,同时元素的下标也发生了变化。
当删除偶数4的时候,下一次循环获取的元素就是9了。 6被跳过了。
其实跳过的不仅有6, 2后面的3也被跳过了。
解决方法如下:
//循环删除偶数
public void deleteEven(ArrayList<Integer> a){
for(int i=0;i<a.size();i++){
if(a.get(i)%2==0){
a.remove(i);
i--;//删除时,回跳一位的下标
}
}
}
//利用遍历删除偶数元素
public void removeByIterate(ArrayList<Integer> a){
Iterator<Integer> array = a.iterator();
int i=0;
while(array.hasNext()){
if(i>=a.size()){//避免获取元素时下标溢出
break;
}else if(a.get(i)%2==0){
a.remove(i);
i--;//删除时,回跳一位的下标
}
i++;
}
}
还有另外一种解决办法,就是倒着循环。修改代码如下:
//倒着循环删除偶数
public void deleteEven(ArrayList<Integer> a){
for(int i=a.size()-1;i>0;i--){
if(a.get(i)%2==0){
a.remove(i);
}
}
}
public void removeByIterate(ArrayList<Integer> a){
Iterator<Integer> array = a.iterator();
int i=a.size()-1;
while(array.hasNext()){
if(i<0){//避免获取元素时下标溢出
break;
}else if(a.get(i)%2==0){
a.remove(i);
}
i--;
}
}
这样也能过滤到全部元素。 另外加一句,真心被这个网页文本编辑器打败了,超级不好用,可能也是我不会用吧。。晕
相关文章
- 暂无相关文章
用户点评