删除StringBuilder的最后一个字符?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (345)

当您必须循环遍历一个集合并使每个数据的字符串由一个分隔符分隔时,您总是在结尾处得到一个额外的分隔符。

for(String serverId : serverIds) {
 sb.append(serverId);
 sb.append(",");
}

给出了如下内容:serverId_1, serverId_2, serverId_3

我想删除StringBuilder中的最后一个字符(不对其进行转换,因为在这个循环之后我仍然需要它)。

提问于
用户回答回答于

其他人指出deleteCharAt方法,但这里还有另一种替代方法:

String prefix = "";
for (String serverId : serverIds) {
  sb.append(prefix);
  prefix = ",";
  sb.append(serverId);
}

在Java 8中,StringJoiner是标准JRE的一部分。

用户回答回答于
StringBuilder sb = new StringBuilder();
sb.append("abcdef");
sb.deleteCharAt(sb.length() - 1);
assertEquals("abcde",sb.toString());
// true
用户回答回答于

或者,

StringBuilder result = new StringBuilder();
    for(String string : collection) {
        result.append(string);
        result.append(",");
    }
    return result.substring(0, result.length() - 1) ;
用户回答回答于

带着Java-8的静态方法String同学们,

String#join(CharSequence delimiter,Iterable<? extends CharSequence> elements)...

public class Test {

    public static void main(String[] args) {

        List<String> names = new ArrayList<>();
        names.add("James");
        names.add("Harry");
        names.add("Roy");
        System.out.println(String.join(",", names));
    }
}

OUTPUT:

James,Harry,Roy
用户回答回答于

另一种选择

for(String serverId : serverIds) {
   sb.append(",");
   sb.append(serverId); 
}
sb.deleteCharAt(0);
用户回答回答于

只需得到最后一个字符出现的位置。

for(String serverId : serverIds) {
 sb.append(serverId);
 sb.append(",");
}
sb.deleteCharAt(sb.lastIndexOf(","));

lastIndexOf将执行反向搜索,并且您知道,在第一次尝试时,性能将不会成为问题。

用户回答回答于

在这种情况下,

sb.setLength(sb.length() - 1);

是更好的选择,因为它只是将最后一个值分配给'\0'而删除最后一个字符System.arraycopy

用户回答回答于

在Java 8中,有一个新的StringJoiner是内置的。

StringJoiner sj = new StringJoiner(", ");
for (String serverId : serverIds) {
    sj.add(serverId)
}
用户回答回答于
用户回答回答于

另一个简单的解决办法是:

sb.setLength(sb.length() - 1);

一个更复杂的解决方案:

上述解决方案假定sb.length() > 0...即有“最后一个字符”要删除。如果你不能做这个假设,并且/或者你不能处理假设不正确时会产生的异常,那么首先检查StringBuilder的长度。

// Readable version
if (sb.length() > 0) {
   sb.setLength(sb.length() - 1);
}

// Concise but harder-to-read version of the above.
sb.setLength(Math.max(sb.length() - 1, 0));

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    7 粉丝1 提问9 回答
  • 四无君

    0 粉丝0 提问3 回答
  • 旺仔小小鹿

    社区 · 运营 (已认证)

    46 粉丝0 提问2 回答
  • 拉布拉多拉不多

    1 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券