用Java加入字符串集合的首选成语

Sea*_*oyd 21 java string collections

给定一个字符串集合,如何在不使用外部库的情况下将它们加入普通Java中?

鉴于以下变量:

Collection<String> data = Arrays.asList("Snap", "Crackle", "Pop");
String separator = ", ";
String joined; // let's create this, shall we?
Run Code Online (Sandbox Code Playgroud)

这就是我在Guava中的表现:

joined = Joiner.on(separator).join(data);
Run Code Online (Sandbox Code Playgroud)

Apache Commons/Lang中:

joined = StringUtils.join(data, separator);
Run Code Online (Sandbox Code Playgroud)

但是在简单的Java中,真的没有比这更好的方法吗?

StringBuilder sb = new StringBuilder();
for(String item : data){
    if(sb.length()>0)sb.append(separator);
    sb.append(item);
}
joined = sb.toString();
Run Code Online (Sandbox Code Playgroud)

Col*_*inD 16

我说最好的方法(如果最好的话,并不是说"最简洁")而不使用Guava就是使用Guava在内部使用的技术,对于你的例子看起来像这样:

Iterator<String> iter = data.iterator();
StringBuilder sb = new StringBuilder();
if (iter.hasNext()) {
  sb.append(iter.next());
  while (iter.hasNext()) {
    sb.append(separator).append(iter.next());
  }
}
String joined = sb.toString();
Run Code Online (Sandbox Code Playgroud)

这不需要在迭代时进行布尔检查,也不必对字符串进行任何后处理.


Dea*_*mer 10

可能不是在循环中一次又一次地调用sb.length(),而是稍微修改了一下.

StringBuilder sb = new StringBuilder();
String separator = "";
for(String item : data){
    sb.append(separator);
    separator=",";
    sb.append(item);
}
joined = sb.toString();
Run Code Online (Sandbox Code Playgroud)


aio*_*obe 8

Java 8+

joined =String.join(separator, data);

Java 7及以下版本

StringBuilder sb = new StringBuilder();
boolean first = true;
for(String item : data){
    if(!first || (first = false)) sb.append(separator);
    sb.append(item);
}
joined = sb.toString();
Run Code Online (Sandbox Code Playgroud)

  • 我不喜欢使用`if(first)`因为它不必要地冗长,但我必须同意`if(!first ||(first = false))`是nifty(+1) (2认同)

Jul*_*les 5

在Java 8中:

String.join (separator, data)
Run Code Online (Sandbox Code Playgroud)