为什么ArrayList.remove不起作用

我有以下代码 –

import java.util.ArrayList; public class ArrayListExp{ public static void main (String[] args){ ArrayList name = new ArrayList(); name.add("Chris"); name.add("Lois"); name.add("Meg"); name.add("Meg"); name.add("Brain"); name.add("Peter"); name.add("Stewie"); System.out.println(name); for ( int i = 0; i < name.size(); i++){ String oldName = name.get(i); if(oldName.equals("Meg")) { name.remove(i); } } System.out.println(name); } } 

但在这里它给了我输出 –

 [Chris, Lois, Meg, Meg, Brain, Peter, Stewie] [Chris, Lois, Meg, Brain, Peter, Stewie] 

我没有明白这一点,为什么这不是删除Meg但我只尝试了一个Meg在这种情况下,它正在工作。 而当我在最后添加几个Meg时,我没有从ArrayList删除一个Meg 。 为什么?

当您删除第一个“Meg”时,索引i=2 。 然后它会增加,但由于其中一个“Meg”已被删除,现在name.get(3)是“Brain”。 所以你实际上没有检查第二个“梅格”。

解决问题。 您可以在删除元素时减少索引:

 public class ArrayListExp{ public static void main (String[] args){ ArrayList name = new ArrayList(); name.add("Chris"); name.add("Lois"); name.add("Meg"); name.add("Meg"); name.add("Brain"); name.add("Peter"); name.add("Stewie"); System.out.println(name); for ( int i = 0; i < name.size(); i++){ String oldName = name.get(i); if(oldName.equals("Meg")) { name.remove(i); i--; } } System.out.println(name); } } 

你正在迭代第一个Meg ,当Meg被移除时,数组值会转移一个。

 [Chris, Lois, Meg, Meg, Brain, Peter, Stewie] 0 1 2 3 4 5 6 

第一个Meg被删除了,循环增加了i,因为它完成了for循环中的所有内容的执行,所以i现在将是3并且数组已被修改:

 [Chris, Lois, Meg, Brain, Peter, Stewie] 0 1 2 3 4 5 

尝试向后迭代。

 for ( int i = name.size() - 1; i >= 0; i--){ String oldName = name.get(i); if(oldName.equals("Meg")) { name.remove(i); } } 

你可以使用name.removeAll(Arrays.asList("Meg")); 删除所有"Meg"

你的完整代码将是

 for ( int i = 0; i < name.size(); i++){ String oldName = name.get(i); if(oldName.equals("Meg")) { name.removeAll(Arrays.asList("Meg")); } } 

你在从0到N迭代它时从ArrayList中删除,所以当你在索引N处移除第一个Meg时,下一个Meg向下移动到索引N,然后你将i递增到N + 1。 所以第二梅格不会被删除。 尝试以相反的顺序迭代(N到0):

 for ( int i = name.size() - 1; i >= 0; i--) { 

因为当i = 2且条件为真时,删除meg并且所有索引都向上移动。 因此接下来我将指向Brain,而不是meg。

尝试这个。 (如果条件成立,则减1)

 for ( int i = 0; i < name.size(); i++){ String oldName = name.get(i); if(oldName.equals("Meg")) { name.remove(i); i--; } } 

删除元素时,不应使用for循环。 在实现某些逻辑时总会出现问题。 为您的问题使用反向循环,并始终尝试使用每个。