繁体   English   中英

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

[英]What's the most elegant way to concatenate a list of values with delimiter in 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在循环内检查。

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

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

完成。

这是我的版本: 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,分配仅在缓存中发生(或者可能仅在寄存器中发生)。

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

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”的类或任何类。 最有可能的是,它们中的任何一个都会提供连接功能。 以下是我在项目中找到的一些示例:

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<Integer> numbers=new ArrayList<Integer>();
    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来实现此功能。 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] 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM