2011-11-17 30 views
1

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

回答

7

该列表正在改变。从最后一个元素迭代到第一个或使用迭代器。

+0

是的,它的工作!谢谢 –

+1

以及接受答案然后:-)虽然我更喜欢在这种情况下使用迭代器,如bringer128的答案中所示 – aishwarya

6

PeterPeiGuo是对的 - 你正在移除正在改变你的索引的元素。

这是迭代器的主要候选者。

Iterator<String> it = list.iterator(); 
while(it.hasNext()) { 
    String val = it.next(); 
    if(val.length() == 4 || val.length() == 2) { 
    it.remove(); 
    } 
} 
0

从列表中删除东西会更改列表中其余东西的索引。

当您的代码运行时,在第一次迭代中,i为0,它将删除“this”条目为0. 在第二次迭代中,i为1,因此它不检查0处的值,即现在“是”,因为“this”已被删除。

正如PeterPeiGui在他的回答中所说的那样,在这种特殊情况下你可以通过倒退来解决它,但是遍历一个集合并同时进行变异总是会引入大量的混淆。

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--; 
    } 
} 
相关问题