如何发出以逗号分隔的列表?

时间:2011-07-12 14:04:19

标签: java

这非常简单,但我见过很多变种,我在其他地方看不到自己的做法。给出:

Iterable<String> strings;

创建一个包含所有字符串的字符串,以逗号分隔。

5 个答案:

答案 0 :(得分:7)

Java-8版本

使用Java 8,幸运的是,最终有一种标准方法可以做到这一点:

String string = StreamSupport.stream(strings.spliterator(), false)
                             .collect(Collectors.joining(", "));

不幸的是,从Iterable to a Stream (yet)

获取更简单的方法

Pre Java-8版本

使用

org.apache.commons.lang.StringUtils.join(Iterator iterator, String separator)

http://commons.apache.org/lang/

如果你想自己做,我有时会这样做

StringBuilder sb = new StringBuilder();
String separator = "";
for (String string : iterable) {
  sb.append(separator);
  sb.append(string);
  separator = ", ";
}

答案 1 :(得分:5)

final StringBuilder sb = new StringBuilder();
final Iterator<String> it = iterable.iterator();
if(it.hasNext()){
  sb.append(it.next());
  while(it.hasNext()){
    sb.append(',').append(it.next());
  }
}
return sb.toString();

但当然我总是喜欢使用Guava的版本

String joined = Joiner.on(',').join(iterable);

(公平地说:我之前曾问过a very similar question

答案 2 :(得分:1)

这是我在大多数项目中包含的连接函数:

public static String join(Iterable<? extends Object> iterable, String delimiter) {
    return join(iterable, delimiter, "", "");
}

public static String join(Iterable<? extends Object> iterable, String delimiter,
        String prepend, String append) {

    StringBuilder buffer = new StringBuilder();
    Iterator<?> iterator = iterable.iterator();
    boolean hasNext = iterator.hasNext();

    while (hasNext) {

        buffer.append(prepend);
        buffer.append(String.valueOf(iterator.next()));
        buffer.append(append);

        if (iterator.hasNext()) {
            buffer.append(delimiter);
        } else {
            hasNext = false;
        }
    }

    return buffer.toString();
}

一些例子:

String[] list = { "hello", "mellow", "jello" };

Util.join(list, ",");                    // "hello,mellow,jello"
Util.join(list, ", and ");               // "hello, and mellow, and jello"
Util.join(list, "&", "x=", "1");         // "x=hello1&x=mellow1&x=jello1"
Util.join(list, " OR ", "(Title:", ")"); // "(Title:hello) OR (Title:mellow) OR (Title:jello)"

答案 3 :(得分:1)

只是为了好玩,一个递归的实现:

public static void main(String[] args) {
    System.out.println(buildCsv(Arrays.asList(new String[] {"one", "two", "three"}).iterator()));
}

private static String buildCsv(Iterator<String> iterator) {
    return iterator.hasNext() ? iterator.next() + (iterator.hasNext() ? "," : "") + buildCsv(iterator) : "";
}

答案 4 :(得分:1)

如果您使用 Java 8 或更高版本,则可以使用String.join

Iterable<String> strings = Arrays.asList("a", "b", "c");
String result = String.join(",", strings);
Assert.assertEquals("a,b,c", result);

如果您使用Eclipse Collections,则可以使用适用于任何Iterable的{​​{3}}实用程序类。

Iterable<String> strings = Arrays.asList("a", "b", "c");
String result = Iterate.makeString(strings, ",");
Assert.assertEquals("a,b,c", result);

Eclipse Collections 7.x适用于 Java 5 或更高版本。 Eclipse Collections 8.x-9.x适用于 Java 8 或更高版本。

注意:我是Eclipse Collections的提交者。