我有以下代码:
public static void main(String[] args) {
StringBuilder phoneNumber = new StringBuilder("828-707-5634");
for(int i = 0; i < phoneNumber.length(); i++)
{
if (phoneNumber.charAt(i) == '-')
phoneNumber.deleteCharAt(i--);
}
System.out.print(phoneNumber);
}
确实这会从电话号码中移除破折号,但直观地说我会期望它在破折号之前移除角色(因为 - )。这是如何工作的?另外,我发现如果我使用++或完全省略增量/减量,则仍然会删除破折号。
答案 0 :(得分:2)
deleteCharAt
收到i
的未分配值,因为表达式 i--
的值是未增加的值。这就是你的代码工作的原因,即使你依赖for
循环的增量表达式来弥补i
中相当人为的,毫无意义的减少。这对我来说似乎相当粗糙,如果第一个字符是短划线,那么i
为-1会在调试期间引起人们的注意。
最好在replace
中使用java.lang.String
方法。见replace String with another in java
否则,我更喜欢
for (int i = 0; i < phoneNumber.length(); /*intentionally empty*/){
if (phoneNumber.charAt(i) == '-'){
phoneNumber.deleteCharAt(i);
} else {
++i;
}
}
虽然由于length()
的重复评估,这仍是O(N 2 )O(N)问题的解决方案!这可以通过向后运行循环来解决,这也将减少元素混洗的次数:
for (int i = -1 + phoneNumber.length(); i >= 0; /*intentionally empty*/){
if (phoneNumber.charAt(i) == '-'){
phoneNumber.deleteCharAt(i);
} else {
--i;
}
}