所以我有这个数组,我想删除长度为2或4个字符的字符串(包含2或4个字符的字符串)。我正在做这个方法,它不起作用,即使在逻辑上,它应该工作。
public static void main(String[] args)
{
ArrayList<String> list = new ArrayList<String>();
list.add("This");
list.add("is");
list.add("a");
list.add("test");
for (int i=0; i<list.size(); i++)
{
if(list.get(i).length()==2 || list.get(i).length()==4)
{
list.remove(i);
}
}
}
我想坚持这种做法。你能否就如何纠正这些代码给我一些建议?
运行时此代码的输出是:
[is, a]
即使我希望输出
[a]
因为“是”是2个字符长。
答案 0 :(得分:7)
列表正在改变。从最后一个元素迭代到第一个元素或使用迭代器。
答案 1 :(得分:6)
PeterPeiGuo是对的 - 您正在移除正在改变索引的元素。
这是迭代器的主要候选者。
Iterator<String> it = list.iterator();
while(it.hasNext()) {
String val = it.next();
if(val.length() == 4 || val.length() == 2) {
it.remove();
}
}
答案 2 :(得分:1)
另一种选择: 删除一个时,将索引减少1。 顺便说一句,它有效,但不是一个好的编码风格。
for (int i=0; i<list.size(); i++)
{
if(list.get(i).length()==2 || list.get(i).length()==4)
{
list.remove(i);
i--;
}
}
答案 3 :(得分:0)
从列表中删除内容会更改列表中剩余内容的索引。
当你的代码运行时,在第一次迭代中,i为0并且它在0处删除“this”条目。 在第二次迭代中,我是1,因此它不检查0处的值,现在是“是”,因为“this”已被删除。
正如PeterPeiGui在他的回答中所说的那样,你可以在这个特殊情况下解决这个问题,只需要向后移动,但是遍历一个集合并同时改变它总是存在引入大量混淆的风险。