StringBuilder - 替换整个字符串。有任何方法吗?

3

我看到现有代码中使用了几个字符串拼接,Sonar 代码覆盖率建议使用 StringBuilder。我正在更新代码以使用 StringBuilder。但是我想知道如何高效地用新字符串覆盖现有内容。

在字符串表示中,应该像下面这样:

String query = "select...";
if ( x ) {
    query = "select xyz...";
}

使用 StringBuilder, 我使用了这个:

 StringBuilder query = new StringBuilder("select...");
 if ( x ) {
     // I need to overwrite the existing stringbuilder content here
     query = new StringBuilder("Select xyz..");
        //or
     query = query.replace(,,,);
        //or
     //Anything better
 }

我希望有一种像这样的方法:

我希望有一种方法类似于:

 query.replace("new string");

这个功能是用新字符串覆盖整个已有字符串的,但它并不可用。


1
你不应该使用 StringBuilder 来做那件事。 - SLaks
我同意,除了使用.delete().append()之外,没有其他简单的方法... 我希望StringBuilder有一个.clear() :( - fge
@fge 是的,这正是我所想的。这是一个非常常见的用例。 - Kevin Rave
1
根据给定的示例代码,构建查询时逐步完成是否比在x为真时全部替换更有意义?您是否可以从它们之间共同拥有的内容开始查询,然后如果x为真,则使用该情况的其余查询完成它,否则为另一种情况完成它? - Scott Shipp
3
我希望StringBuilder有一个.clear()方法:您可以使用.setLength(0)。 - Thilo
显示剩余2条评论
3个回答

11
query.replace(0,query.length(), "new string");

应该可以工作。


我已经意识到了这一点。这是唯一的方法吗?这并不简单。 - Kevin Rave
在标准库中,恐怕是这样的。 - arynaq
1
很遗憾,没有一个 query.set("new string"); 方法。 - Yetti99

0

对于您的用例,以下内容似乎非常完美:

private static final String SELECT_PRE = "Select";
private static final String SELECT_POST = "...";
StringBuilder query = new StringBuilder(SELECT_PREFIX+SELECT_POST);
if ( x ) {
     query = query.insert(SELECT_PREFIX.length(), " xyz");
}

0

这里有一个解决方案,虽然不是最优雅的,但使用了 StringBuilder.replace(int start, int end, String str) 方法。
假设有两个条件:

  • 条件1:你想用 "xxx" 替换 "ele"
  • 条件2:你想用 "yyy" 替换 "..."

请尝试以下方法

StringBuilder query = new StringBuilder("select...");
String x = "ele";

String term1 = "ele";
String newTerm1 = "xxx";
String term2 = "...";
String newTerm2 = "yyy";

if ( x.equals(term1) ) {
    int start = query.indexOf(term1);
    int end = start + term1.length();
    query.replace(start, end, newTerm1);

}
else if (x.equals(term2)){
    int start = query.indexOf(term2);
    int end = start + term2.length();
    query.replace(start, end, newTerm2);
}
System.out.println(query.toString());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接