有人可以向我解释下面这段代码的错误吗?
public static void main(String[] args) {
List<String> l = new ArrayList<String>();
l.add("1");
l.add("2");
l.add("3");
l.add("4");
for (int i = 0; i < l.size(); i++) {
if(l.get(i).equals("1"))
l.remove(l.get(i));
else
System.out.println(l.get(i));
}
}
给我输出[3.4]而不是[2,3,4] ..我的[2]是什么?我对列表中的这种行为感到困惑。如果有人可以解释那么好......
提前致谢:)
答案 0 :(得分:5)
原因是:
当i = 0时,你删除第一个元素,然后我变成1
当i = 1时,你现在处于第三个元素,因为你已经将所有内容都降低了1,所以你写了“3”
当i = 2时,你写第三个元素是“4”
输出“3”,“4”
另一种实现可能是:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Item {
public static void main(String[] args) {
List<String> l = new ArrayList<String>();
l.add("1");
l.add("2");
l.add("3");
l.add("4");
Iterator<String> iter = l.iterator();
while(iter.hasNext())
{
String value = iter.next();
if("1".equals(value))
{
iter.remove();
}
else
{
System.out.println(value);
}
}
}
}
答案 1 :(得分:2)
致电l.remove
后,当前元素(l.get(i)
)最终成为下一个元素("2"
)。
但是,在调用remove
之后,您继续循环并最终跳过该元素。
要解决此问题,您可以在i--
中添加if
,以便下一次迭代(i++
之后)处理新的当前元素
答案 2 :(得分:1)
SLaks是正确的,问题是什么,我建议语法更像这样。
int i=0;
while(i < l.size())
{
if(l.get(i).equals("1"))
l.remove(l.get(i));
else
{
System.out.println(l.get(i++));
}
}
答案 3 :(得分:-1)
如果你把别人拿走,它会给你所需的功能。
List<String> l = new ArrayList<String>();
l.add("1");
l.add("2");
l.add("3");
l.add("4");
for (int i = 0; i < l.size(); i++) {
if(l.get(i).equals("1"))
l.remove(l.get(i));
System.out.println(l.get(i));
}