Mat*_*hew 391 java stringbuilder
当你必须遍历一个集合并用分隔符分隔每个数据的字符串时,你最终总会得到一个额外的分隔符,例如
for (String serverId : serverIds) {
sb.append(serverId);
sb.append(",");
}
Run Code Online (Sandbox Code Playgroud)
给出类似:serverId_1,serverId_2,serverId_3,
我想删除StringBuilder中的最后一个字符(没有转换它,因为我在这个循环之后仍然需要它).
Jon*_*eet 598
其他人已经指出了这种deleteCharAt方法,但这是另一种替代方法:
String prefix = "";
for (String serverId : serverIds) {
sb.append(prefix);
prefix = ",";
sb.append(serverId);
}
Run Code Online (Sandbox Code Playgroud)
从Java 8开始,它StringJoiner是标准JRE的一部分.
Ste*_*n C 395
另一个简单的解决方案
sb.setLength(sb.length() - 1);
Run Code Online (Sandbox Code Playgroud)
更复杂的解决方案:
上述解决方案假设sb.length() > 0...即要删除"最后一个字符".如果你不能做出这个假设,和/或你不能处理如果假设不正确会发生的异常,那么首先检查StringBuilder的长度; 例如
// Readable version
if (sb.length() > 0) {
sb.setLength(sb.length() - 1);
}
Run Code Online (Sandbox Code Playgroud)
要么
// Concise but harder-to-read version of the above.
sb.setLength(Math.max(sb.length() - 1, 0));
Run Code Online (Sandbox Code Playgroud)
bra*_*boy 169
sb.deleteCharAt(sb.length() - 1)
Run Code Online (Sandbox Code Playgroud)
Art*_*are 58
从Java 8开始,String类有一个静态方法join.第一个参数是你想要在每对字符串之间的字符串,第二个参数是一个Iterable<CharSequence>(它们都是接口,所以类似于List<String>工作.所以你可以这样做:
String.join(",", serverIds);
Run Code Online (Sandbox Code Playgroud)
同样在Java 8中,您可以使用新StringJoiner类,以便在您拥有要放入的完整元素列表之前开始构建字符串.
Reu*_*iro 36
只需获取最后一个字符出现的位置.
for(String serverId : serverIds) {
sb.append(serverId);
sb.append(",");
}
sb.deleteCharAt(sb.lastIndexOf(","));
Run Code Online (Sandbox Code Playgroud)
由于lastIndexOf将执行反向搜索,并且您知道它会在第一次尝试时找到,因此性能不会成为问题.
小智 34
在这种情况下,
sb.setLength(sb.length() - 1);
Run Code Online (Sandbox Code Playgroud)
是最好的,因为它只是指定最后一个值,'\0'而删除最后一个字符System.arraycopy
Cod*_*roc 12
有了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));
}
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT
James,Harry,Roy
Run Code Online (Sandbox Code Playgroud)
Raf*_*fiq 10
另一种选择
for(String serverId : serverIds) {
sb.append(",");
sb.append(serverId);
}
sb.deleteCharAt(0);
Run Code Online (Sandbox Code Playgroud)
或者,
StringBuilder result = new StringBuilder();
for(String string : collection) {
result.append(string);
result.append(',');
}
return result.substring(0, result.length() - 1) ;
Run Code Online (Sandbox Code Playgroud)
StringBuilder sb = new StringBuilder();
sb.append("abcdef");
sb.deleteCharAt(sb.length() - 1);
assertEquals("abcde",sb.toString());
// true
Run Code Online (Sandbox Code Playgroud)
另一个选择:
public String join(Collection<String> collection, String seperator) {
if (collection.isEmpty()) return "";
Iterator<String> iter = collection.iterator();
StringBuilder sb = new StringBuilder(iter.next());
while (iter.hasNext()) {
sb.append(seperator);
sb.append(iter.next());
}
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
282665 次 |
| 最近记录: |