为什么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循环。 在实现某些逻辑时总会出现问题。 为您的问题使用反向循环,并始终尝试使用每个。