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

JavaArrays

Java Problem Overview


I want to join a String[] with a glue string. Is there a function for this?

Java Solutions


Solution 1 - Java

Starting from Java8 it is possible to use String.join().

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

Generates:

Hello, World, !

Otherwise, Apache Commons Lang has a StringUtils class which has a join function which will join arrays together to make a String.

For example:

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

Generates the following String:

Hello, World, !

Solution 2 - Java

If you were looking for what to use in android, it is:

String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)

for example:

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

Solution 3 - Java

In Java 8 you can use

  1. Stream API :

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

  2. new String.join method: https://stackoverflow.com/a/21756398/466677

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

Solution 4 - Java

You could easily write such a function in about ten lines of code:

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

Solution 5 - Java

A little mod instead of using 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();
}

Solution 6 - Java

As with many questions lately, Java 8 to the rescue:


Java 8 added a new static method to java.lang.String which does exactly what you want:

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

Using it:

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

Results in:

"Hello, World, !"

Solution 7 - Java

Google guava's library also has [this kind of capability][1]. You can see the String[] example also from the API.

As already described in the api, beware of the immutability of the builder methods.

It can accept an array of objects so it'll work in your case. In my previous experience, i tried joining a Stack which is an iterable and it works fine.

Sample from me :

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

prints out : |i am a coder| [1]: http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Joiner.html

Solution 8 - Java

Given:

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

Then as an alternative to coobird's answer, where the glue is ", ":

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

Or to concatenate with a different string, such as " &amp; ".

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

However... this one ONLY works if you know that the values in the array or list DO NOT contain the character string ", ".

Solution 9 - Java

If you are using the Spring Framework then you have the StringUtils class:

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

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

Solution 10 - Java

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.

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

Solution 11 - Java

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.

Solution 12 - Java

Just for the "I've the shortest one" challenge, here are mines ;)

Iterative:

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

Recursive:

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

Solution 13 - Java

Nothing built-in that I know of.

Apache Commons Lang has a class called StringUtils which contains many join functions.

Solution 14 - Java

This is how I do it.

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

Solution 15 - Java

A similar alternative

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

Solution 16 - Java

My spin.

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, "");
}

Solution 17 - Java

Do you like my 3-lines way using only String class's methods?

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

Solution 18 - Java

To get "str1, str2" from "str1", "str2", "" :

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

Also you can add extra null-check

Solution 19 - Java

In case you're using Functional Java library and for some reason can't use Streams from Java 8 (which might be the case when using Android + Retrolambda plugin), here is a functional solution for you:

String joinWithSeparator(List<String> items, String separator) {
    return items
            .bind(id -> list(separator, id))
            .drop(1)
            .foldLeft(
                    (result, item) -> result + item,
                    ""
            );
}

Note that it's not the most efficient approach, but it does work good for small lists.

Solution 20 - Java

Whatever approach you choose, be aware of null values in the array. Their string representation is "null" so if it is not your desired behavior, skip null elements.

String[] parts = {"Hello", "World", null, "!"};
Stream.of(parts)
      .filter(Objects::nonNull)
      .collect(Collectors.joining(" "));

Solution 21 - Java

I do it this way using a StringBuilder:

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)

Solution 22 - Java

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

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

Solution 23 - Java

java.util.Arrays has an 'asList' method. Together with the java.util.List/ArrayList API this gives you all you need:;

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNick HeinerView Question on Stackoverflow
Solution 1 - JavacoobirdView Answer on Stackoverflow
Solution 2 - JavaNoahView Answer on Stackoverflow
Solution 3 - JavaMarek GregorView Answer on Stackoverflow
Solution 4 - JavaJayView Answer on Stackoverflow
Solution 5 - JavaeverlastoView Answer on Stackoverflow
Solution 6 - JavaiczaView Answer on Stackoverflow
Solution 7 - JavaAlbert GanView Answer on Stackoverflow
Solution 8 - JavaRob at TVSeries.comView Answer on Stackoverflow
Solution 9 - JavadevstopfixView Answer on Stackoverflow
Solution 10 - JavaBrad BeattieView Answer on Stackoverflow
Solution 11 - JavaquietmintView Answer on Stackoverflow
Solution 12 - Javasp00mView Answer on Stackoverflow
Solution 13 - JavaJonMRView Answer on Stackoverflow
Solution 14 - JavaRichard CorfieldView Answer on Stackoverflow
Solution 15 - JavaWilliam SimpsonView Answer on Stackoverflow
Solution 16 - JavaJacksonView Answer on Stackoverflow
Solution 17 - JavaRyoichiro OkaView Answer on Stackoverflow
Solution 18 - JavaemaView Answer on Stackoverflow
Solution 19 - JavaDmitry ZaytsevView Answer on Stackoverflow
Solution 20 - JavaMr.QView Answer on Stackoverflow
Solution 21 - Javaspanky762View Answer on Stackoverflow
Solution 22 - JavaGaurav AdurkarView Answer on Stackoverflow
Solution 23 - JavaAdriaan KosterView Answer on Stackoverflow