Java数组的函数是否类似于PHP中的join()函数?

270

我想用一个粘合字符串(glue string)连接一个String[]数组,有没有相关的函数可以实现这个目的?


7
Java 8已经默认包含了这个功能。我建议读者滚动查看@Marek Gregor的答案(并点赞...)。 - stav
可能是[A quick and easy way to join array elements with a separator (the opposite of split) in Java]的重复问题。(https://dev59.com/q3I-5IYBdhLWcg3wMFMf) - Anderson Green
24个回答

318

Java8开始,可以使用String.join()

String.join(", ", new String[]{"Hello", "World", "!"})

生成:
Hello, World, !

否则,Apache Commons Lang 有一个 StringUtils 类,其中包含一个 join 函数,该函数将数组连接在一起以生成一个 String
例如:
StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")

生成以下的 String
Hello, World, !

7
为了方便寻找答案的人,应该注意这也等同于Perl中的join函数。 - k-den
3
它说对我来说它是未定义的。 - Ninjaxor
9
我建议您编辑此回答,附加对Java 8中引入的新String.join()方法的引用。这样,阅读此答案的人群将从这一知识中受益。目前,提到这一事实的最高票答案已经被淹没在下面了…… - Duncan Jones
对于Gradle:compile 'org.apache.commons:commons-lang3:3.3.2' - Elliot Chance
1
值得一提的是,String.join() 只适用于 List<CharSequence>CharSequence[] 类型的元素。 - Enigo
显示剩余2条评论

73

如果您正在寻找在Android上使用的内容,则是:

String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)
例如:
String joined = TextUtils.join(";", MyStringArray);

2
这显然是所有 Android 版本中最好的答案,因为 Java 8 只会在 Android 上稍后发布。该解决方案使用内置的 Android 库,而不是这些愚蠢的“包含一个庞大的库来执行一个操作”的解决方案。 - LukeStoneHm
现在是2017年9月,Android上的Java 8还很遥远。感谢您的回答! - techfly

58

53

你可以轻松地用约十行代码编写这样的函数:

String combine(String[] s, String glue)
{
  int k = s.length;
  if ( k == 0 )
  {
    return null;
  }
  StringBuilder out = new StringBuilder();
  out.append( s[0] );
  for ( int x=1; x < k; ++x )
  {
    out.append(glue).append(s[x]);
  }
  return out.toString();
}

35
在你看来,良好的实践方式没有通用标准。 - phoebus
24
但如果我加上括号,那就会增加两行代码,而我就无法声称只用了11行代码来实现了! - Jay
8
问题在于,当你或其他人匆忙地在if/for语句中添加另一行却没有加上花括号时;或者删除了if(k==0)后面的return null语句,在某些情况下这样做可以成功编译但结果是错误的。因此最好为了那个闭合括号牺牲一个额外的行(打开括号可以留在同一if/for行)。 - milan
16
我认为很棒的是,尽管大多数编程语言在其核心中都包含这种功能,但Java社区鼓励每个人重新发明轮子。 - John Strickler
34
11行?呸!只需要一行就能搞定!只需在源文件中删除所有换行符即可。 - Thomas Eding
显示剩余15条评论

27
使用一个小的自定义函数代替使用 substring() 方法:
//join(String array,delimiter)
public static String join(String r[],String d)
{
        if (r.length == 0) return "";
        StringBuilder sb = new StringBuilder();
        int i;
        for(i=0;i<r.length-1;i++){
            sb.append(r[i]);
            sb.append(d);
        }
        sb.append(r[i]);
        return sb.toString();
}

1
投票支持,因为您不需要添加任何库。 - givanse
10
对于每个String,使用.append()两次而不是将它们连接起来再附加到builder中,这样会更好吗? - Talha Ahmed Khan

18

最近关于很多问题,Java 8 可以帮上忙:


Java 8 新增了一个静态方法到 java.lang.String 中,它正好可以满足你的需求:

public static String join(CharSequence delimeter, CharSequence... elements);

使用它:

String s = String.join(", ", new String[] {"Hello", "World", "!"});

结果为:

"Hello, World, !"

14

谷歌的guava库也具有这种功能。你可以从API中查看String[]的示例。

如API所述,要注意构建器方法的不可变性。

它可以接受对象数组,因此它可以在你的情况下工作。在我的以往经验中,我尝试连接了一个Stack,它是一个iterable,并且可以正常工作。

以下是我的示例:

Deque<String> nameStack = new ArrayDeque<>();
nameStack.push("a coder");
nameStack.push("i am");
System.out.println("|" + Joiner.on(' ').skipNulls().join(nameStack) + "|");

输出:|我是一名程序员|


9

给定:

String[] a = new String[] { "Hello", "World", "!" };

作为coobird答案的替代方案,我们将使用“,”作为粘合剂:
Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")

或者与另一个字符串连接,例如 "&amp;"。
Arrays.asList(a).toString().replaceAll(", ", " &amp; ").replaceAll("^\\[|\\]$", "")

然而,这个方法仅在您确定数组或列表中的值不包含字符字符串", "时才有效。


Arrays.asList(a).toString() 对我想要做的事情起到了作用。 - Solomon Ucko

9

如果你正在使用Spring Framework,那么你可以使用StringUtils 类:

import static org.springframework.util.StringUtils.arrayToDelimitedString;

arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");

8
不在核心功能中。但是,搜索“java数组连接字符串粘合剂”将为您提供一些代码片段,以实现此目的。
例如:
public static String join(Collection s, String delimiter) {
    StringBuffer buffer = new StringBuffer();
    Iterator iter = s.iterator();
    while (iter.hasNext()) {
        buffer.append(iter.next());
        if (iter.hasNext()) {
            buffer.append(delimiter);
        }
    }
    return buffer.toString();
}

2
使用StringBuilder(非线程安全)代替StringBuffer(线程安全)以获得更好的性能。接口是相同的。 - Asaph
2
这似乎来自http://snippets.dzone.com/posts/show/91。评论中提到了一个改进版本:public static String join( Iterable< ? extends Object > pColl, String separator ) { Iterator< ? extends Object > oIter; if ( pColl == null || ( !( oIter = pColl.iterator() ).hasNext() ) ) return ""; StringBuilder oBuilder = new StringBuilder( String.valueOf( oIter.next() ) ); while ( oIter.hasNext() ) oBuilder.append( separator ).append( oIter.next() ); return oBuilder.toString(); } - Quantum7

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