for (String serverId : serverIds) {
sb.append(serverId);
sb.append(",");
}
结果类似于: serverId_1, serverId_2, serverId_3,
我想在StringBuilder中删除最后一个字符(不转换,因为我在此循环之后仍需要它)。
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的一部分。
StringUtils
提供了另一种替代Guava的Joiner
的选择,可以使用join
方法。具体请参考链接:http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#join(java.lang.Object[], java.lang.String) - GoRoS另一个简单的解决方案是:
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));
setLength
正在减少长度,则ensureCapacityInternal
将不会调用Arrays.copy
。(我正在查看Java 11代码,但我认为这适用于所有版本。) - Stephen Cif(sb.length() > 0){
sb.deleteCharAt(sb.length() - 1);
}
从Java 8开始,String类有一个静态方法join
。第一个参数是你想在每对字符串之间插入的字符串,第二个参数是Iterable<CharSequence>
(它们都是接口,因此像List<String>
这样的东西也可以用)。所以你可以这样做:
String.join(",", serverIds);
在Java 8中,您还可以使用新的StringJoiner
类来处理这种情况:您希望在拥有要放入其中的所有元素之前开始构造字符串。
String.join
上,而不是StringJoiner
。 - ArtOfWarfare只需获取最后一个字符出现的位置即可。
for(String serverId : serverIds) {
sb.append(serverId);
sb.append(",");
}
sb.deleteCharAt(sb.lastIndexOf(","));
由于 lastIndexOf
将执行反向搜索,并且您知道它会在第一次尝试中找到,因此性能不会是一个问题。
编辑
由于我的答案一直得到点赞(谢谢大家 ),因此值得注意的是:
在Java 8及更高版本中,使用StringJoiner将更具可读性和明确性。 它有一个用于简单分隔符的方法,以及一个用于前缀和后缀的重载。
这里是从此处选取的示例:
使用简单分隔符的示例:
StringJoiner mystring = new StringJoiner("-"); // Joining multiple strings by using add() method mystring.add("Logan"); mystring.add("Magneto"); mystring.add("Rogue"); mystring.add("Storm"); System.out.println(mystring);
输出:
Logan-Magneto-Rogue-Storm
带前缀和后缀的示例:
StringJoiner mystring = new StringJoiner(",", "(", ")"); // Joining multiple strings by using add() method mystring.add("Negan"); mystring.add("Rick"); mystring.add("Maggie"); mystring.add("Daryl"); System.out.println(mystring);
输出
(Negan,Rick,Maggie,Daryl)
,
因为它是 for循环
的最后一条语句。使用 lastIndexOf
更多是为了可读性和使其变得更容易,如果你不想记住它是否以0为索引。此外,你无需修改StringBuilder的长度。这只是为了方便而已。 - Reuel Ribeiro在这种情况下,
sb.setLength(sb.length() - 1);
更好的方法是直接将最后一个值分配给'\0'
,而不是删除最后一个字符时使用System.arraycopy
setLength
方法没有向最后一个值分配任何内容。Java 字符串缓冲区不是 null/零终止的。实际上,setLength
只是更新了一个 length
字段。 - Stephen Carraycopy
复制了0个元素,所以我猜它可以被优化掉。 - maaartinus使用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));
}
}
输出
James,Harry,Roy
另一种选择
for(String serverId : serverIds) {
sb.append(",");
sb.append(serverId);
}
sb.deleteCharAt(0);
或者,
StringBuilder result = new StringBuilder();
for(String string : collection) {
result.append(string);
result.append(',');
}
return result.substring(0, result.length() - 1) ;
StringBuilder sb = new StringBuilder();
sb.append("abcdef");
sb.deleteCharAt(sb.length() - 1);
assertEquals("abcde",sb.toString());
// true
StringJoiner
:https://dev59.com/enA75IYBdhLWcg3wP2kg#29169233 - ArtOfWarfare