Java中如何撤销String.split()方法的效果?

136

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

在尝试自己编写代码之前,希望在论坛上询问一下(因为JDK已经有了一切)。


1
只需遍历数组并将元素连接到 StringBuilder 中即可。 - Steve Kuo
5
以下是需要翻译的内容:Duplicate of https://dev59.com/rXVD5IYBdhLWcg3wKoWH, https://dev59.com/h3RB5IYBdhLWcg3w-8A9, https://dev59.com/UHVC5IYBdhLWcg3wtzkQ, https://dev59.com/wnVD5IYBdhLWcg3wL4iM, and several others.这是一些问题的副本,这些问题包括如何在Java中构建带分隔符的字符串的最佳方法、如何为除最后一个行之外的所有行追加换行符、从集合创建逗号分隔字符串的最复杂方式以及连接字符串数组的算法。 - Michael Myers
3
谢谢。我确实写了这样一个方法,但在过去多次重复发明轮子后,发现jdk已经有它了...嗯,觉得发帖还是值得的。 -- Phil - javaphild
如果输入是使用正则表达式分割的,例如s = "foo:bar,baz".split("[:,]"),那么您只能进行估计。 - user unknown
请参考@DenTheMan的答案,使用Arrays.toString(Object[])。 - earcam
16个回答

97

6
未来读者注意:Java 8有一个String.join()方法。 - GiovanyMoreno

56
自2009年以来,一直存在一个公开的功能请求。长话短说,它将成为JDK 8的java.util.StringJoiner类的功能之一。http://download.java.net/lambda/b81/docs/api/java/util/StringJoiner.html 如果您感兴趣,这是Oracle的问题。https://bugs.java.com/bugdatabase/view_bug?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);

25
你可以从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("[\\[\\]]", "");

12
有点晚了,但这听起来像是一个一般性的坏主意,除非你绝对确定在你的字符串中永远不会有“,”。即使是这样,这也可能远非高效。 - John Chadwick

16

我从这里获取了以下示例here

/*
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" }, "$#$"));
  }
}

12

我总是更喜欢使用Google API而不是Apache.commons。谢谢。 - botchniaque

10

如果你想创建一个与集合(Collection)一起使用的自定义方法,可以在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();
}

我倾向于省略空值检查,因为行为将保持不变,为什么要用特殊情况来复杂化代码呢?另一方面,可能需要进行 null 检查。 - Carl Manaster
@Carl:我完全同意你的空值检查,并已添加。检查空集合允许函数跳过不必要地创建迭代器和StringBuffer,所以我保留了它。 - Bill the Lizard
1
你应该使用StringBuilder而不是StringBuffer,因为StringBuffer有额外的同步开销。对于方法变量,您不需要同步(因为只有一个线程会使用它)。 - Steve Kuo
1
你的join方法应该接受Collection,而不是AbstractCollection。更好的做法是它可以接受Iterable,这样它就更通用了。 - Steve Kuo
@Steve:任何一个都可以接受。您可以根据需要进行抽象或具体化。链接页面上有一个稍后的示例,可以接受Iterable。 - Bill the Lizard
您还可以使用"<? extends Object>"泛型类型以及"iter.next().toString()"来连接整数和其他类型的字符串表示形式。 - tomash

7
如果你有一个int[],Arrays.toString()是最简单的方法。

1
实际上,这对于String[]也适用,使用Arrays.toString(Object[])。自从2004年发布Java 1.5以来,它就已经可用了,比问题发布的时间早得多。如果您不介意前缀“ [”和后缀“]”,那么这是正确的答案。 - earcam

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();
}

我认为这是更好的方法,简单而高效。还要提到的是,Apache使用一个带有if语句的简单for循环,而OpenJDK8则采用类似于你的但分离成多个方法的方式。 - PhoneixS
您会很高兴地知道,Java 8现在可以使用内置的String.join()方法来实现此功能。 - Brad Turek

3

自从JDK8推出Streams和Lambdas,我非常喜欢它们,所以我建议:

public static String join( String delimiter, String[] array )
{
    return Arrays.asList( array ).stream().collect( Collectors.joining( delimiter ) );
}

3

针对Android系统:在android.text.TextUtils中,有以下方法:

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

返回一个由分隔符连接的令牌字符串。
令牌--要连接的对象数组。通过调用object.toString()方法,将从对象中形成字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接