JavaScript有Array.join()

js>["Bill","Bob","Steve"].join(" and ")
Bill and Bob and Steve

Java有这样的东西吗?我知道我可以用StringBuilder自己拼凑一些东西:

static public String join(List<String> list, String conjunction)
{
   StringBuilder sb = new StringBuilder();
   boolean first = true;
   for (String item : list)
   {
      if (first)
         first = false;
      else
         sb.append(conjunction);
      sb.append(item);
   }
   return sb.toString();
}

. .但是如果像这样的东西已经是JDK的一部分,那么这样做就没有意义了。


当前回答

EDIT

我还注意到toString()底层实现问题,以及包含分隔符的元素,但我认为我是偏执狂。

鉴于我对此有两点看法,我将我的答案改为:

static String join( List<String> list , String replacement  ) {
    StringBuilder b = new StringBuilder();
    for( String item: list ) { 
        b.append( replacement ).append( item );
    }
    return b.toString().substring( replacement.length() );
}

这看起来和最初的问题很相似。

所以如果你不想把整个罐子添加到你的项目中,你可以使用这个。

我认为你原来的代码没有问题。实际上,每个人都建议的替代方案看起来几乎相同(尽管它做了一些额外的验证)

这里有Apache 2.0许可证。

public static String join(Iterator iterator, String separator) {
    // handle null, zero and one elements before building a buffer
    if (iterator == null) {
        return null;
    }
    if (!iterator.hasNext()) {
        return EMPTY;
    }
    Object first = iterator.next();
    if (!iterator.hasNext()) {
        return ObjectUtils.toString(first);
    }

    // two or more elements
    StringBuffer buf = new StringBuffer(256); // Java default is 16, probably too small
    if (first != null) {
        buf.append(first);
    }

    while (iterator.hasNext()) {
        if (separator != null) {
            buf.append(separator);
        }
        Object obj = iterator.next();
        if (obj != null) {
            buf.append(obj);
        }
    }
    return buf.toString();
}

现在我们知道了,谢谢开源

其他回答

你可以这样做:

String aToString = java.util.Arrays.toString(anArray);
// Do not need to do this if you are OK with '[' and ']'
aToString = aToString.substring(1, aToString.length() - 1);

或者单行语句(仅当不需要'['和']'时)

String aToString = java.util.Arrays.toString(anArray).substring(1).replaceAll("\\]$", "");

希望这能有所帮助。

Java 8确实带来了

Collectors.joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)

方法,通过对空值使用前缀+后缀,该方法为nullsafe。

它可以以以下方式使用:

String s = stringList.stream().collect(Collectors.joining(" and ", "prefix_", "_suffix"))

收藏家。join (CharSequence delimiter)方法只是在内部调用joining(delimiter, "", "")。

谷歌的Guava API也有.join(),尽管(从其他回复中应该很明显),Apache Commons在这里几乎是标准的。

使用java 8收集器,这可以用以下代码完成:

Arrays.asList("Bill", "Bob", "Steve").stream()
.collect(Collectors.joining(" and "));

此外,java 8中最简单的解决方案:

String.join(" and ", "Bill", "Bob", "Steve");

or

String.join(" and ", Arrays.asList("Bill", "Bob", "Steve"));

在纯JDK中有一种有趣的方法:

String[] array = new String[] { "Bill", "Bob", "Steve","[Bill]","1,2,3","Apple ][" };
String join = " and ";

String joined = Arrays.toString(array).replaceAll(", ", join)
        .replaceAll("(^\\[)|(\\]$)", "");

System.out.println(joined);

输出:

比尔、鲍勃、史蒂夫、[比尔]、1,2,3和苹果][


一个不太完美也不太有趣的方式!

String[] array = new String[] { "7, 7, 7","Bill", "Bob", "Steve", "[Bill]",
        "1,2,3", "Apple ][" };
String join = " and ";

for (int i = 0; i < array.length; i++) array[i] = array[i].replaceAll(", ", "~,~");
String joined = Arrays.toString(array).replaceAll(", ", join)
        .replaceAll("(^\\[)|(\\]$)", "").replaceAll("~,~", ", ");

System.out.println(joined);

输出:

7,7,7和比尔,鲍勃,史蒂夫和[比尔],1,2,3和苹果][