我可以使用常规for循环从ArrayList中删除某些对象吗?

时间:2016-11-30 00:49:21

标签: java for-loop arraylist

我们假设我们有一个Cats的ArrayList。

这是我们的猫:

public class Cat{
   String color;
   int age;
   public Cat(String color, int age){
       this.color = color;
       this.age = age;
   }
 }

我们有一只猫,每只猫都有颜色。在我们的代码中的其他地方,我们有以下内容:

 ArrayList<Cat>cats = new ArrayList<Cat>();
 cats.add(new Cat("white",5);
 cats.add(new Cat("black",6);
 cats.add(new Cat("orange",10);
 cats.add(new Cat("gray",3);
 System.out.println(cats.size()); prints out 4

所以现在猫ArrayList里面有4只猫。如果我想要移除所有5岁以上的猫,该怎么办?我不能做以下事情吗?

for(int index = 0; index<cats.size(); index++){
    if(cats.get(index).age > 5){
        cats.remove(index);
    }
}

现在,在运行之后,我打印出了猫ArrayList的大小,并且它显示为3,即使它应该删除3只猫并留下一只。

所以,不应该这样做吗?我不明白为什么它不会。还有哪些方法可以从List / Array中删除具有特定值的对象?

1 个答案:

答案 0 :(得分:0)

您的示例的问题是您从cats数组中删除了一个项目,但没有考虑新的大小。发生了什么:

  • i = 0.猫是&#34;白色&#34;,年龄是5,所以无事可做
  • i = 1.猫是&#34;黑&#34;,年龄是6.在索引1处删除了项目(现在大小为3,索引1为&#34;橙色&#34;)
  • i = 2.猫是&#34;灰色&#34;,年龄是3,所以无事可做
  • i = 3,小于猫的大小(3),所以不要再次进入循环

如果您确定要使用for循环,最简单的解决方案是每次删除元素时将索引减1,如下所示:

for(int index = 0; index<cats.size(); index++){
   if(cats.get(index).age > 5){
       cats.remove(index);
       index = index - 1; // Accounting for index of elements ahead changing by one
   }
}