Java 为什么选择StringBuilder';s delete将字符串向左移动,不删除最后一个字符?

Java 为什么选择StringBuilder';s delete将字符串向左移动,不删除最后一个字符?,java,Java,我是新来的。 我试图找出如何删除字符串中的最后一个字符,但没有成功。 我在StringBuilder中使用我的代码 例如,我有一串“abcde” 我想在删除第一个字符-字符串bcde后获取 但我得到了字符串bcdee。 我一直在删除-最后一个字符没有被删除 我想删除字符串中的第一个字符,并且在末尾不留任何内容 StringBuilder test = new StringBuilder(); test.append("abcde");

我是新来的。 我试图找出如何删除字符串中的最后一个字符,但没有成功。 我在StringBuilder中使用我的代码

例如,我有一串“abcde” 我想在删除第一个字符-字符串bcde后获取 但我得到了字符串bcdee。 我一直在删除-最后一个字符没有被删除 我想删除字符串中的第一个字符,并且在末尾不留任何内容

        StringBuilder test = new StringBuilder();
        test.append("abcde");
        test.deleteCharAt(0);
        test.deleteCharAt(0);
        test.deleteCharAt(0);
        test.deleteCharAt(0);
运行此代码之后 我得到:我想得到:

bcdee    bcde
cdeee    cde
deeee    de
eeeee    e
我想知道如何删除字符串中的最后一个字符

要删除
字符串中的最后一个字符

String s = someString.substring(0, someString.length() - 1)
请注意,
字符串
是可求和的,因此上面实际上是在创建一个新的
字符串

要删除StringBuilder中的最后一个字符,请执行以下操作:

someStringBuilder.setLength(someStringBuilder.length() - 1);
还可以使用删除最后一个字符

someStringBuilder.deleteCharAt(someStringBuilder.length() - 1);
上面的代码片段都假设有最后一个要删除的字符


您的代码调用
deleteCharAt(0)
。这将删除第一个字符,而不是最后一个字符


但您的示例似乎要求删除字符串末尾的重复字符。为此,您需要一个循环:

pseudocode

while last character equals second to last character:
    remove last character

看看你是否能自己编码…

首先,你的代码:

    StringBuilder test = new StringBuilder();
    test.append("abcde");
    System.out.println(test);
    test.deleteCharAt(0);
    System.out.println(test);
    test.deleteCharAt(0);
    System.out.println(test);
    test.deleteCharAt(0);
    System.out.println(test);
    test.deleteCharAt(0);
    System.out.println(test);
产出:

abcde
bcde
cde
de
正如你在原始问题中提到的那样,这是正确的,没有任何额外的
e
s。所以,试着找出你的代码中还有什么导致了这一点


为什么在StringBuilder中将字符串向左移动而不删除最后一个字符

它移动,因为,通过
test.deleteCharAt(0)
,您显式地告诉Java在特定(
0
,在本例中)索引处删除字符,因此新字符串不会以空字符开头;但是,它应该是nt,并且它不会删除最后一个字符,并且最后一个额外字符永远不会追加(没有额外的
e


除了
.setLength()
.subString()
之外,您只需使用相同的
.deleteCharAt(int)
API,并执行以下操作:

    StringBuilder test = new StringBuilder();
    test.append("abcde");
    System.out.println(test);
    test.deleteCharAt(test.length()-1);
    System.out.println(test);
    test.deleteCharAt(test.length()-1);
    System.out.println(test);
    test.deleteCharAt(test.length()-1);
    System.out.println(test);
    test.deleteCharAt(test.length()-1);
    System.out.println(test);

我无法复制:
StringBuilder测试=新建StringBuilder();测试。附加(“abcde”);测试。删除字符(0);系统输出打印LN(测试)打印“bcde”如何打印?如果我使用
java.lang.StringBuilder
类并添加
System.out.println(测试)在您的代码之后,它会打印“e”,非常感谢您的支持,当我查看调试时-我看到字符串本身在最后没有被删除,我不明白为什么。@dustyeav欢迎使用堆栈溢出。请学习如何使用堆栈溢出,并阅读如何提高问题的质量。然后,您的问题将包括您的源代码,这些源代码可以由其他人编译和测试。
StringBuilder
不会覆盖尾随字符,因为它不是必需的。
StringBuilder
包含一个字段
size
,用于记录有效内容的长度。
size
字符之后的字符数组中的所有内容都不重要。非常感谢您的帮助,当我调试时-我仍然在末尾看到未删除的字符串。您可能误解了
StringBuilder
内部数据结构。不要使用调试器,尝试调用
StringBuilder.toString
并打印结果。