在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();
不要使用’+’表示字符串传染。 它很慢。
我敢打赌,在任何中型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]