在Java中使用分隔符连接值列表的最优雅方法是什么?

我从来没有找到一种干净利落的方法来做到以下几点。

假设我有一个列表/数组字符串。

abc def ghi jkl 

我想将它们连接成一个由逗号分隔的单个字符串,如下所示:

 abc,def,ghi,jkl 

在Java中,如果我写这样的东西(原谅语法),

 String[] list = new String[] {"abc","def","ghi","jkl"}; String str = null; for (String s : list) { str = str + s + "," ; } System.out.println(str); 

我去拿

 abc,def,ghi,jkl, //Notice the comma in the end 

所以我必须重写上面的for循环如下

 ... for (int i = 0; i < list.length; i++) { str = str + list[i]; if (i != list.length - 1) { str = str + ","; } } ... 

这可以在Java中以更优雅的方式完成吗?

我当然会使用StringBuilder / Buffer来提高效率,但我想说明这个案例而不是太冗长。 优雅,我的意思是一个解决方案,避免丑陋(?) if检查循环内部。

这是我的版本: Java技巧:收集字符串中对象的最快方法

 StringBuilder buffer = new StringBuilder (); String delim = ""; for (Object o: list) { buffer.append (delim); delim = ", "; // Avoid if(); assignment is very fast! buffer.append (o); } buffer.toString (); 

另外一个好处是:如果循环中的代码更复杂,那么这种方法将产生正确的结果,而不需要复杂的if() s。

另请注意,对于现代CPU,分配仅在缓存中发生(或者可能仅在寄存器中)。

结论:虽然这段代码乍一看看起来很奇怪,但它有很多优点。

使用Guava(以前的google-collections)木匠类 :

 Joiner.on(",").join(list) 

完成。

 StringBuilder builder = new StringBuilder(); for (String st: list) { builder.append(st).append(','); } builder.deleteCharAt(builder.length()); String result = builder.toString(); 

不要使用’+’表示字符串传染。 它很慢。

看这里:

http://snippets.dzone.com/posts/show/91

有关此主题的完整讨论。

我敢打赌,在任何中型Java项目的类路径上都有几个名为“StringUtil”,“StringsUtil”,“Strings”的类或其他任何类。 最有可能的是,它们中的任何一个都将提供连接function。 以下是我在项目中找到的一些示例:

 org.apache.commons.lang.StringUtils.join(...) org.apache.wicket.util.string.Wicket.join(...) org.compass.core.util.StringUtils.arrayToDelimitedString(...) 

由于您可能希望将来摆脱一些外部依赖,您可能想要这样的事情:

 public static final MyStringUtils { private MyStringUtils() {} public static String join(Object[] list, String delim) { return org.apache.commons.lang.StringUtils.join(list, delim); } } 

现在这就是我所说的“优雅”;)

检查这是否有用:

 List numbers=new ArrayList(); numbers.add(1); numbers.add(2); numbers.add(3); numbers.add(4); numbers.add(5); numbers.add(6); String str = " "; for(Integer s:numbers){ str=str+s+" , "; } System.out.println(str.substring(0,str.length()-2)); 

我会使用StringBuffer来实现此function。 String是不可变的,因此每次连接两个String ,都会创建一个新对象。

使用StringBuffer更有效:

 String[] list = new String[] {"abc","def","ghi","jkl"}; StringBuffer str = new StringBuffer(); for (String s : list) { str.append(s); str.append(","); } str.deleteCharAt(str.length()); System.out.println(str); //automatically invokes StringBuffer.toString(); 
 for (int i = 0; i < list.length-1; i++) { str = str + list[i]; str = str + ","; } str = str + list[list.length-1]