我对这个小程序有一个小问题。它应该使用StringBuilder实例来删除标点符号。我没有包括所有标点符号,但由于某种原因,当我编译它时,它不会删除感叹号,但它会执行其他标点符号。很奇怪。这是我的代码:
import java.lang.StringBuilder;
public class Chapter1Reinforcement8 {
public static StringBuilder removePunctuation(StringBuilder s) {
for (int i=0; i<=s.length(); i++) {
if(s.charAt(i)=='!' | s.charAt(i)=='\'' | s.charAt(i)=='.'| s.charAt(i)==','| s.charAt(i)=='?') {
s.deleteCharAt(i);
}
}
return s;
}
public static void main(String[] args) {
StringBuilder s = new StringBuilder("Let's get Mike, Theresa, and Sam.!?");
System.out.println("The old sentence is: " +s);
StringBuilder newSentence = new StringBuilder();
newSentence = removePunctuation(s);
System.out.println("The new sentence is: " +newSentence);
}
}
有人能在这看到这个问题吗? 谢谢!
答案 0 :(得分:3)
您需要向后迭代StringBuilder
:
public static StringBuilder removePunctuation(StringBuilder s) {
for (int i=s.length() - 1; i >= 0; i--) {
if(s.charAt(i)=='!' || s.charAt(i)=='\'' || s.charAt(i)=='.'| s.charAt(i)==','|| s.charAt(i)=='?') {
s.deleteCharAt(i);
}
}
如果您向前迭代,当您从位置i
删除第一个标点符号时,i + 1
处的字符将成为i
处的新字符;然后你增加i
。如果i
处的新字符是标点符号,则不会再次检查。
答案 1 :(得分:1)
您需要在if条件中使用||
进行OR比较而不是逻辑OR |
。改变这个:
if(s.charAt(i)=='!' | s.charAt(i)=='\'' | s.charAt(i)=='.'| s.charAt(i)==','| s.charAt(i)=='?') {
到
if(s.charAt(i)=='!' || s.charAt(i)=='\'' || s.charAt(i)=='.'|| s.charAt(i)==','|| s.charAt(i)=='?') {