Loop不会从字符串中删除字符的每个实例

时间:2017-03-04 20:51:05

标签: java

我正在为一个类的项目工作,我们只需要使用charAt(),length(),substring()和equals()来操作字符串。

我被困在从字符串中删除字符的每个实例的位上。如果字符串具有连续的相同字符,则程序每次都会保留一个字符例如“下午”。如果我想删除'n',程序将正确删除n,输出为“afteroo”。但是,如果我想删除'o',则输出为“afternon。”

这就是我对这部分程序的看法:

System.out.println("Enter the character to remove.");
removeChar = keyboard.nextLine();

char remove = removeChar.charAt(0),
     original;  

for(i=0; i < input.length(); i++){
    original = sentence.charAt(i);
    if(original == remove)
        sentence = sentence.substring(0,i) + sentence.substring(i+1);
}
System.out.println(sentence);

3 个答案:

答案 0 :(得分:2)

因为要从for循环中的字符串中删除字符,所以如果要在一行中删除两个字符,则第二个字符将被遗漏。这是因为当您删除第一个时,第二个将在索引中移动到第一个的位置,然后您将增加i。要解决这个问题,要么在删除字符时不增加i,要么存储要删除的字符的索引,并将其全部从字符串后面删除到前面以避免同样的问题再次出现。如果您想在删除字符时避免递增i,则while循环可以更好地工作。

答案 1 :(得分:2)

您可以执行UnknowableIneffible的建议,也可以按如下方式更新i

if(original == remove){
    sentence = sentence.substring(0,i) + sentence.substring(i+1);
    i--;
}

答案 2 :(得分:1)

UnknowableIneffible的答案很重要,在这种情况下,while循环会更容易。你也可以坚持你的for循环,但是反过来:

for (int i = input.length() - 1; i >= 0; i--)

这样,你不会受到变化角色的影响,因为它只会“落后”你。

当使用索引循环从集合中删除东西时,这很有效。高级循环抛出ConcurrentModificationException,计算潜在客户将错过元素并导致IndexOutOfBoundsException,但倒数就行了。