删除StringBuilder的最后一个字符?

当你不得不循环一个集合并且用分隔符分隔每个数据的string时,你总是会在最后得到一个额外的分隔符,例如

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); } 

或者,使用Guava的Joiner类:)

从Java 8开始, StringJoiner是标准JRE的一部分。

另一个简单的解决scheme是

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

更复杂的解决scheme:

上面的解决scheme假设sb.length() > 0 …即有一个“最后一个字符”删除。 如果你不能做出这样的假设,并且/或者你不能处理如果假设不正确的情况下会发生的exception,那么先检查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)); 
 sb.deleteCharAt(sb.length()-1) 

从Java 8开始,内置了一个新的StringJoiner类。

 StringJoiner sj = new StringJoiner(", "); for (String serverId : serverIds) { sj.add(serverId) } 

在这种情况下,

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

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

只要得到最后一个字符发生的位置。

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

由于lastIndexOf将执行反向search,并且您知道它会在第一次尝试中find,因此性能不会成为问题。

另一种select

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

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 

或者,

 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 

还有另一种select:

 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(); } 

为了避免prefix使用(影响性能),使用TextUtils.isEmpty:

  String prefix = ""; for (String item : list) { sb.append(prefix); if (TextUtils.isEmpty(prefix)) prefix = ","; sb.append(item); } 

我正在做这样的事情:

  StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < value.length; i++) { stringBuilder.append(values[i]); if (value.length-1) { stringBuilder.append(", "); } } 

您可以尝试使用“Joiner”类,而不是从生成的文本中删除最后一个字符;

  List<String> textList = new ArrayList<>(); textList.add("text1"); textList.add("text2"); textList.add("text3"); Joiner joiner = Joiner.on(",").useForNull("null"); String output = joiner.join(textList); //output : "text1,text2,text3" 

这是另一个解决scheme:

 for(String serverId : serverIds) { sb.append(","); sb.append(serverId); } String resultingString = ""; if ( sb.length() > 1 ) { resultingString = sb.substring(1); }