我正在为一个类的项目工作,我们只需要使用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);
答案 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
,但倒数就行了。