133

我正在寻找一种将字符串数组组合成分隔字符串的方法。与 split() 相反。

在我自己写之前想问问论坛(因为JDK什么都有)

4

16 回答 16

96

据我所知,JDK 中没有针对此的方法。Apache Commons Lang在类中有各种重载join()方法,StringUtils可以做你想做的事。

于 2009-04-27T16:25:39.590 回答
52

至少从 2009 年开始就有一个开放的功能请求。总而言之,它将成为 JDK 8 的 java.util.StringJoiner 类功能的一部分。 http://download.java.net/lambda/b81/docs/api/java/util/StringJoiner.html

如果您有兴趣,这里是 Oracle 问题。 http://bugs.sun.com/view_bug.do?bug_id=5015163

这是一个字符串数组上的新 JDK 8 StringJoiner 示例

String[] a = new String[]{"first","second","third"};
StringJoiner sj = new StringJoiner(",");
for(String s:a) sj.add(s);
System.out.println(sj); //first,second,third

String 中的实用方法使这更加简单:

String s = String.join(",", stringArray);
于 2013-08-19T19:16:35.477 回答
24

Arrays您可以将此功能从实用程序包中偷偷出来。

import java.util.Arrays;
...
    String delim = ":",
            csv_record = "Field0:Field1:Field2",
            fields[] = csv_record.split(delim);

    String rebuilt_record = Arrays.toString(fields)
            .replace(", ", delim)
            .replaceAll("[\\[\\]]", "");
于 2011-05-24T20:31:12.623 回答
16

我在这里得到了以下示例

/*
7) Join Strings using separator >>>AB$#$CD$#$EF

 */

import org.apache.commons.lang.StringUtils;

public class StringUtilsTrial {
  public static void main(String[] args) {

    // Join all Strings in the Array into a Single String, separated by $#$
    System.out.println("7) Join Strings using separator >>>"
        + StringUtils.join(new String[] { "AB", "CD", "EF" }, "$#$"));
  }
}
于 2009-04-27T16:35:24.467 回答
12

Google 还在他们的 Google Collections 库中提供了一个 joiner 类:

连接器 API

谷歌收藏

于 2009-04-28T04:14:22.960 回答
10

如果您想推出自己的与集合一起使用的DZone Snippets ,有几个示例。例如:

public static String join(AbstractCollection<String> s, String delimiter) {
    if (s == null || s.isEmpty()) return "";
    Iterator<String> iter = s.iterator();
    StringBuilder builder = new StringBuilder(iter.next());
    while( iter.hasNext() )
    {
        builder.append(delimiter).append(iter.next());
    }
    return builder.toString();
}
于 2009-04-27T16:33:33.253 回答
7

If you have an int[], Arrays.toString() is the easiest way.

于 2012-05-11T16:07:19.470 回答
4

基于之前的所有答案:

public static String join(Iterable<? extends Object> elements, CharSequence separator) 
{
    StringBuilder builder = new StringBuilder();

    if (elements != null)
    {
        Iterator<? extends Object> iter = elements.iterator();
        if(iter.hasNext())
        {
            builder.append( String.valueOf( iter.next() ) );
            while(iter.hasNext())
            {
                builder
                    .append( separator )
                    .append( String.valueOf( iter.next() ) );
            }
        }
    }

    return builder.toString();
}
于 2010-09-02T17:44:44.073 回答
3

对于 Android:在 android.text.TextUtils 中有方法:

public static String join (CharSequence delimiter, Iterable tokens)
public static String join (CharSequence delimiter, Object[] tokens)

返回包含由分隔符连接的标记的字符串。

tokens -- 要加入的数组对象。字符串将通过调用 object.toString() 从对象中形成。

于 2013-11-19T14:26:42.233 回答
3

由于 JDK8 我非常喜欢 Streams 和 Lambdas,所以我建议:

public static String join( String delimiter, String[] array )
{
    return Arrays.asList( array ).stream().collect( Collectors.joining( delimiter ) );
}
于 2017-07-26T12:50:39.703 回答
2

为了完整起见,我想补充一点,您通常不能反转String#split,因为它接受正则表达式。

"hello__world".split("_+");产量["hello", "world"]
"hello_world".split("_+");产量["hello", "world"]

这些从不同的起点产生相同的结果。分裂不是一对一的操作,因此是不可逆的。

综上所述,如果您假设您的参数是固定字符串,而不是正则表达式,那么您当然可以使用许多已发布的答案之一来做到这一点。

于 2013-12-03T19:25:14.700 回答
1

如果您使用 jdk8,请参阅@Nathaniel Johnson 的答案,因为这样会更好。

我认为这里的许多答案都很复杂或不容易阅读。分支预测如此高效,为什么您根本不使用 if 语句?

public static String join(List<String> fooList){

    if (fooList.isEmpty()) return "";

    StringBuilder sb = null;

    for (String element : fooList) {

        if (sb == null) {
            sb = new StringBuilder();
        } else {
            sb.append(", ");
        }

        sb.append(element);
    }
    return sb.toString();
}

应该提到的是,Apache 使用了一个简单的 for 循环,其中包含这样的 if 语句(它使用数组作为索引来知道第一个元素),而 openjdk 8 也这样做,但在单独的方法调用中而不是简单的循环。

于 2015-02-19T16:35:04.913 回答
1

我写了这个:

public static String join(Collection<String> col, String delim) {
    StringBuilder sb = new StringBuilder();
    Iterator<String> iter = col.iterator();
    if (iter.hasNext())
        sb.append(iter.next());
    while (iter.hasNext()) {
        sb.append(delim);
        sb.append(iter.next());
    }
    return sb.toString();
}

CollectionJSP 不支持,所以对于 TLD,我写道:

public static String join(List<?> list, String delim) {
    int len = list.size();
    if (len == 0)
        return "";
    StringBuilder sb = new StringBuilder(list.get(0).toString());
    for (int i = 1; i < len; i++) {
        sb.append(delim);
        sb.append(list.get(i).toString());
    }
    return sb.toString();
}

.tld归档:

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
    <function>
        <name>join</name>
        <function-class>com.core.util.ReportUtil</function-class>
        <function-signature>java.lang.String join(java.util.List, java.lang.String)</function-signature>
    </function>
</taglib>

并在 JSP 文件中将其用作:

<%@taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt"%>
${funnyFmt:join(books, ", ")}
于 2013-04-05T15:09:52.810 回答
1

这个也不错:

public static String join(String delimitor,String ... subkeys) {
    String result = null;
    if(null!=subkeys && subkeys.length>0) {
        StringBuffer joinBuffer = new StringBuffer(subkeys[0]);
        for(int idx=1;idx<subkeys.length;idx++) {
            joinBuffer.append(delimitor).append(subkeys[idx]);
        }
        result = joinBuffer.toString();
    }
    return result;
}
于 2013-03-27T03:25:58.500 回答
1

下面的代码给出了一个基本的想法。虽然这不是最好的解决方案。

public static String splitJoin(String sourceStr, String delim,boolean trim,boolean ignoreEmpty){
    return join(Arrays.asList(sourceStr.split(delim)), delim, ignoreEmpty);
}


public static String join(List<?> list, String delim, boolean ignoreEmpty) {
    int len = list.size();
    if (len == 0)
        return "";
    StringBuilder sb = new StringBuilder(list.get(0).toString());
    for (int i = 1; i < len; i++) {
        if (ignoreEmpty && !StringUtils.isBlank(list.get(i).toString())) {
            sb.append(delim);
            sb.append(list.get(i).toString().trim());
        }
    }
    return sb.toString();
}
于 2016-10-24T18:52:36.310 回答
0

我更喜欢这个:

public String join(Collection<String> strCollection, String delimiter) {
    String joined = "";
    int noOfItems = 0;
    for (String item : strCollection) {
        joined += item;
        if (++noOfItems < strCollection.size())
            joined += delimiter;
    }
    return joined;
}

这是迄今为止我找到的最简洁的解决方案。(不用担心使用原始 String 对象而不是 StringBuilder。现代 Java 编译器无论如何都使用 StringBuilder,但这段代码更具可读性)。

于 2011-03-19T05:49:21.973 回答