Java:像PHP的 join()那样的数组函数?

Java: function for arrays like PHP's join()?

我想用胶串连接一个String[]。有这个功能吗?


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

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

生成:

1
Hello, World, !

否则,ApacheCommonsLang有一个StringUtils类,该类具有join函数,该函数将数组连接在一起以生成String

例如:

1
2
StringUtils.join(new String[] {"Hello","World","!
<div class="
suo-content">[collapse title=""]<ul><li>为了让搜索这个答案的人受益,应该注意,这也相当于一个Perl连接。</li><li>它说我没有定义</li><li>"1"。commons lang*jar必须在类路径2中。导入org.apache.commons.lang3.stringutils;</li><li>我建议您编辑这个答案,将引用添加到Java 8中介绍的新EDCOX1×0方法。这样,大量阅读这一公认答案的人将受益于这一知识。目前,提到这一事实的投票最高的答案在下面是相当失败的…</li><li>对于Gradle:<wyn>compile 'org.apache.commons:commons-lang3:3.3.2'</wyn>。</li><li>值得一提的是,<wyn>String.join()</wyn>只适用于<wyn>List<CharSequence></wyn>或<wyn>CharSequence[]</wyn>元素。</li><li>也请看下面的Marek Gregor回答,因为它提到了Java流+收集方式:EDCOX1(5)</li></ul>[/collapse]</div><hr><P>如果你想在Android中使用什么,它是:</P>[cc lang="java"]String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)

例如:

1
String joined = TextUtils.join(";", MyStringArray);


在Java 8中,您可以使用

1)流API:

1
2
String[] a = new String[] {"a","b","c"};
String result = Arrays.stream(a).collect(Collectors.joining(","));

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


您可以很容易地用大约十行代码编写这样的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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();
}


一点mod而不是使用substring():

1
2
3
4
5
6
7
8
9
10
11
12
13
//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();
}


正如最近的许多问题,Java 8的救援:

Java 8向EDCOX1 6增加了一个新的静态方法,它正好符合您的需要:

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

使用它:

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

结果:

1
"Hello, World, !"

谷歌的番石榴图书馆也有这种能力。您还可以从API中看到字符串[]示例。

正如API中已经描述的,注意构建器方法的不可变性。

它可以接受一个对象数组,这样它就可以在您的情况下工作。在我以前的经验中,我尝试加入一个栈,它是一个不可更改的,并且工作正常。

我的样品:

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

打印输出:|i am a coder|


如果您使用的是Spring框架,那么就有了StringUtils类:

1
2
3
4
import static org.springframework.util.StringUtils.arrayToDelimitedString;

arrayToDelimitedString(new String[] {"A","B","C
<hr><P>鉴于:</P>[cc lang="
java"]String[] a = new String[] {"Hello","World","!" };

然后作为库伯德答案的替代,胶水在哪里":

1
Arrays.asList(a).toString().replaceAll("^\\[|\\]$","")

或与其他字符串连接,如"&;amp;"。

1
Arrays.asList(a).toString().replaceAll(","," &amp;").replaceAll("^\\[|\\]$","")

然而。。。只有当您知道数组或列表中的值不包含字符串",


Not in core, no. A search for"java array join string glue" will give you some code snippets on how to achieve this though.

e.g.

1
2
3
4
5
6
7
8
9
10
11
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();
}


If you've landed here looking for a quick array-to-string conversion, try Arrays.toString().

Creates a String representation of the Object[] passed. The result is
surrounded by brackets ("[]"), each element is converted to a String
via the String.valueOf(Object) and separated by ",". If the array is
null, then "null" is returned.


只为"我有最短的一个"挑战,这里是我的;)

迭代:

1
2
3
4
5
6
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();
}

递归的:

1
2
3
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)));
}


我就是这样做的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private String join(String[] input, String delimiter)
{
    StringBuilder sb = new StringBuilder();
    for(String value : input)
    {
        sb.append(value);
        sb.append(delimiter);
    }
    int length = sb.length();
    if(length > 0)
    {
        // Remove the extra delimiter
        sb.setLength(length - delimiter.length());
    }
    return sb.toString();
}

我不知道有什么内在的东西。

ApacheCommonsLang有一个名为StringUtils的类,它包含许多连接函数。


我的旋转。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static String join(Object[] objects, String delimiter) {
  if (objects.length == 0) {
    return"";
  }
  int capacityGuess = (objects.length * objects[0].toString().length())
      + ((objects.length - 1) * delimiter.length());
  StringBuilder ret = new StringBuilder(capacityGuess);
  ret.append(objects[0]);
  for (int i = 1; i < objects.length; i++) {
    ret.append(delimiter);
    ret.append(objects[i]);
  }
  return ret.toString();
}

public static String join(Object... objects) {
  return join(objects,"");
}

A similar alternative

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * @param delimiter
 * @param inStr
 * @return String
 */

public static String join(String delimiter, String... inStr)
{
    StringBuilder sb = new StringBuilder();
    if (inStr.length > 0)
    {
        sb.append(inStr[0]);
        for (int i = 1; i < inStr.length; i++)
        {
            sb.append(delimiter);                  
            sb.append(inStr[i]);
        }
    }
    return sb.toString();
}

你喜欢我只使用string类方法的3行方式吗?

1
2
3
4
5
static String join(String glue, String[] array) {
    String line ="";
    for (String s : array) line += s + glue;
    return (array.length == 0) ? line : line.substring(0, line.length() - glue.length());
}


在使用函数Java库的情况下,由于某种原因无法使用Java 8的流(使用Android +RealLAMBDA插件时可能会出现这种情况),这是一个功能性解决方案:

1
2
3
4
5
6
7
8
9
String joinWithSeparator(List<String> items, String separator) {
    return items
            .bind(id -> list(separator, id))
            .drop(1)
            .foldLeft(
                    (result, item) -> result + item,
                   ""
            );
}

请注意,这不是最有效的方法,但对于小的列表确实有效。


要从"str1"、"str2"、""中获取"str1,str2":

1
Stream.of("str1","str2","").filter(str -> !str.isEmpty()).collect(Collectors.joining(","));

也可以添加额外的空检查


我使用一个StringBuilder这样做:

1
2
3
4
5
6
7
8
9
10
11
public static String join(String[] source, String delimiter) {
    if ((null == source) || (source.length < 1)) {
        return"";
    }

    StringBuilder stringbuilder = new StringBuilder();
    for (String s : source) {
        stringbuilder.append(s + delimiter);
    }
    return stringbuilder.toString();
} // join((String[], String)


There is simple shorthand technique I use most of the times..

1
2
3
4
5
6
String op = new String;
for (int i : is)
{
    op += candidatesArr[i-1]+",";
}
op = op.substring(0, op.length()-1);


java.util.array有一个"aslist"方法。再加上java.util.list/arraylist API,这就为您提供了所需的一切:;

1
2
3
4
5
6
private static String[] join(String[] array1, String[] array2) {

    List<String> list = new ArrayList<String>(Arrays.asList(array1));
    list.addAll(Arrays.asList(array2));
    return list.toArray(new String[0]);
}