Java:PHP的join()等数组的函数?

Nic*_*ner 255 php java arrays join

我想String[]加一个胶水串.这有功能吗?

coo*_*ird 307

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

String.join(", ", new String[]{"Hello", "World", "!"})
Run Code Online (Sandbox Code Playgroud)

产生:

Hello, World, !
Run Code Online (Sandbox Code Playgroud)

否则,Apache Commons Lang有一个StringUtils类,它具有join将数组连接在一起的函数String.

例如:

StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")
Run Code Online (Sandbox Code Playgroud)

生成以下内容String:

Hello, World, !
Run Code Online (Sandbox Code Playgroud)

  • 我建议你编辑这个答案来附加对新的引用[`String.join()`](http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#在Java 8中引入的join-java.lang.CharSequence-java.lang.CharSequence ...-)方法.这样,阅​​读这个被接受的答案的大量人将从这些知识中受益.目前,提到这一事实的最高投票答案相当于...... (9认同)
  • 为了寻找这个答案的人的利益,应该注意这也是Perl连接的等价物. (7认同)
  • 它说这对我来说是不确定的 (3认同)

Noa*_*oah 71

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

String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)
Run Code Online (Sandbox Code Playgroud)

例如:

String joined = TextUtils.join(";", MyStringArray);
Run Code Online (Sandbox Code Playgroud)

  • 这显然是所有Android版本的最佳答案,因为Java 8仅在Android上出现.这个解决方案使用内置的Android库,而不是这些愚蠢的"包含巨大的lib来执行一个动作"的解决方案. (2认同)

Mar*_*gor 55

在Java 8中,您可以使用

1)流API:

String[] a = new String[] {"a", "b", "c"};
String result = Arrays.stream(a).collect(Collectors.joining(", "));
Run Code Online (Sandbox Code Playgroud)

2)新的String.join方法:https://stackoverflow.com/a/21756398/466677

3)java.util.StringJoiner类:http://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html


Jay*_*Jay 52

您可以在大约十行代码中轻松编写这样的函数:

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 根据你的良好做法......这类事情没有通用的标准. (35认同)
  • 11行?呸! 我可以在1做!只需删除源文件中的所有换行符即可. (33认同)
  • 但是,如果我包括大括号,那么会添加两行代码,而我无法声称已经在11行中完成了它! (24认同)
  • 我认为很棒的是,虽然大多数语言都将这些功能集成到其核心,但Java社区鼓励每个人重新发明轮子. (16认同)
  • 问题是当你经过一段时间或其他人匆忙之后,在没有添加括号的情况下添加另一行if if/for; 或删除if之后返回null(k == 0),在某些情况下会编译但是不正确.然后最好为那个闭合支撑牺牲一条额外的线(开口可以保持相同的if/for line). (8认同)
  • 花时间自己实现它,将它放在一些随机包中,并将其命名为"combine"而不是"join"对我来说似乎已经是三种不好的做法. (8认同)
  • 我们在这里切线,但我个人经常在只有一条线时省略括号,特别是如果它是一个很大的if/elseif/elseif结构,用于紧凑.但是当你的if/else和任何一个分支需要括号时,我把它放在两者上以保持对称性.我不会担心有人添加一条线而没有意识到他需要添加大括号.如果一个程序员在块中有多行时不知道他需要括号,我不相信他有什么线索放在块内. (7认同)
  • @milan这就是为什么我通常更喜欢在编写代码之前思考,而不是随意推送随机语句.添加无用的括号和什么不能帮助一些白痴模仿工作(主要做破坏性的事情)是一件错误的事情. (4认同)
  • Java被编译成字节码,因此我们不需要将其缩小 - 使代码尽可能可读和可维护. (4认同)
  • "总而言之,不要重新发明轮子.如果你需要做一些似乎应该相当普遍的事情,那么图书馆里可能已经有了一个你想要的东西.如果有的话,使用它;如果你不知道,检查.一般来说,库代码可能比你自己编写的代码更好,而且可能随着时间的推移而改进.这并不反映你作为程序员的能力.规模经济决定了这个库代码得到的关注远远超过大多数开发人员可以承担的相同功能." Bloch,Effective Java(第2版) (4认同)
  • 是的,我不打算重新编写已经在标准String类中的函数.但我也不会花费无限的时间在网上搜索一个问题的解决方案,我可以在一两个小时内轻松编写代码.这是"重新发明轮子"吗?我想是这样.就像物理制造商每天重新发明轮子一样.你认为世界上只有一家工厂制造轮子,其他人都从这些工厂购买?没有?为什么不?因为有时你想要一个与其他人不同规格的车轮,...... (3认同)
  • 是的,总是使用花括号.这就是让Java如此美好和舒适的原因!即使SUN并不总是将它们添加到自己的代码示例中. (2认同)
  • ...就像儿童玩具卡车的轮子可能不适合全尺寸卡车.而且因为有时制造自己的车轮而不是从别人那里购买它们会更便宜.当然,拥有一个大工厂而不是100个小工厂有规模经济.但总成本中有很多因素,而规模只是其中之一. (2认同)

eve*_*sto 25

一个小mod而不是使用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();
}
Run Code Online (Sandbox Code Playgroud)

  • 第7行:如果对每个`String`使用两次`.append()`而不是连接它们然后追加到构建器,那会更好吗? (10认同)

icz*_*cza 18

与最近的许多问题一样,Java 8也在拯救:


Java 8添加了一个新的静态方法,java.lang.String它正是您想要的:

public static String join(CharSequence delimeter, CharSequence... elements);
Run Code Online (Sandbox Code Playgroud)

使用它:

String s = String.join(", ", new String[] {"Hello", "World", "!"});
Run Code Online (Sandbox Code Playgroud)

结果是:

"Hello, World, !"
Run Code Online (Sandbox Code Playgroud)


ber*_*tie 14

Google guava的库也具有这种功能.您也可以从API中看到String []示例.

正如api中已经描述的那样,要注意构建器方法的不变性.

它可以接受一系列对象,因此它适用于您的情况.在我以前的经验中,我尝试加入一个可迭代的Stack,它工作正常.

我的样品:

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

打印出来: |i am a coder|


Rob*_*com 9

鉴于:

String[] a = new String[] { "Hello", "World", "!" };
Run Code Online (Sandbox Code Playgroud)

然后作为coobird的答案的替代,胶水是",":

Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")
Run Code Online (Sandbox Code Playgroud)

或者用不同的字符串连接,例如"&".

Arrays.asList(a).toString().replaceAll(", ", " &amp; ").replaceAll("^\\[|\\]$", "")
Run Code Online (Sandbox Code Playgroud)

但是......只有当你知道数组或列表中的值不包含字符串","时,这个才有效.


dev*_*fix 9

如果您使用的是Spring Framework,那么您将拥有StringUtils类:

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

arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");
Run Code Online (Sandbox Code Playgroud)


小智 8

不是核心,不是.搜索"java array join string glue"会给你一些关于如何实现这一点的代码片段.

例如

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 使用StringBuilder(非线程安全)代替StringBuffer(线程安全)以获得更好的性能.界面是一样的. (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(); } (2认同)

qui*_*int 6

如果您已经在这里寻找快速的数组到字符串转换,请尝试使用Arrays.toString().

创建Object[]传递的String表示形式.结果被括号("[]")括起来,每个元素都通过String.valueOf(Object)和转换为一个String ", ".如果是数组 null,则"null"返回.


sp0*_*00m 5

只是为了"我是最短的"挑战,这里是地雷;)

迭代:

public static String join(String s, Object... a) {
    StringBuilder o = new StringBuilder();
    for (Iterator<Object> i = Arrays.asList(a).iterator(); i.hasNext();)
        o.append(i.next()).append(i.hasNext() ? s : "");
    return o.toString();
}
Run Code Online (Sandbox Code Playgroud)

递归:

public static String join(String s, Object... a) {
    return a.length == 0 ? "" : a[0] + (a.length == 1 ? "" : s + join(s, Arrays.copyOfRange(a, 1, a.length)));
}
Run Code Online (Sandbox Code Playgroud)

  • 递归版本很优雅.绝对会使用它. (2认同)