如何删除一定长度的字符串

时间:2011-11-17 01:44:18

标签: java

所以我有这个数组,我想删除长度为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个字符长。

4 个答案:

答案 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在他的回答中所说的那样,你可以在这个特殊情况下解决这个问题,只需要向后移动,但是遍历一个集合并同时改变它总是存在引入大量混淆的风险。