web-dev-qa-db-fra.com

Java: fonction pour les tableaux comme PHP (join ())?

Je veux rejoindre un String[] avec une chaîne de colle. Y a-t-il une fonction pour cela?

254
Nick Heiner

À partir de Java8 , il est possible d'utiliser String.join().

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

Génère:

Hello, World, !

Sinon, Apache Commons Lang a une fonction StringUtils qui possède une fonction join qui réunira les tableaux pour former un String.

Par exemple:

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

Génère le String suivant:

Hello, World, !
307
coobird

Si vous cherchiez quoi utiliser dans Android, c'est:

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

par exemple:

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

Dans Java 8, vous pouvez utiliser

1) API Stream:

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

2) nouvelle méthode String.join: https://stackoverflow.com/a/21756398/466677

3) classe Java.util.StringJoiner: http://docs.Oracle.com/javase/8/docs/api/Java/util/StringJoiner.html

55
Marek Gregor

Vous pouvez facilement écrire une telle fonction en une dizaine de lignes de 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();
}
52
Jay

Un petit mod au lieu d'utiliser 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();
}
25
everlasto

Comme beaucoup de questions récemment, Java 8 à la rescousse:


Java 8 a ajouté une nouvelle méthode statique à Java.lang.String qui fait exactement ce que vous voulez:

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

En l'utilisant:

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

Résulte en:

"Hello, World, !"
18
icza

La bibliothèque de Google Gava a également ce type de capacité . Vous pouvez également voir l'exemple String [] à partir de l'API.

Comme déjà décrit dans l’API, méfiez-vous de l’immuabilité des méthodes de construction.

Il peut accepter un tableau d'objets afin que cela fonctionne dans votre cas. Dans mon expérience précédente, j'ai essayé de rejoindre une pile qui est un itératif et cela fonctionne bien.

Échantillon de moi:

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

imprime: |i am a coder|

14
bertie

Donné:

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

Alors comme alternative à la réponse de coobird, où la colle est ",":

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

Ou concaténer avec une chaîne différente, telle que "amp;".

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

Cependant ... celui-ci fonctionne UNIQUEMENT si vous savez que les valeurs du tableau ou de la liste NE contiennent PAS la chaîne de caractères ",".

9
Rob at TVSeries.com

Si vous utilisez le Spring Framework , vous avez la classe StringUtils :

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

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

Pas dans le noyau, non. Une recherche sur "Java array join string string glue" vous donnera cependant des extraits de code expliquant comment y parvenir.

par exemple.

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

Si vous avez atterri ici pour rechercher une conversion rapide de tableau en chaîne, essayez Arrays.toString () (--- .

Crée une représentation sous forme de chaîne du Object[] passé. Le résultat est entouré de crochets ("[]"), chaque élément est converti en chaîne via la String.valueOf(Object) et séparé par ", ". Si le tableau est null, alors "null" est renvoyé.

6
quietmint

Juste pour le "J'ai le plus court défi" ( défi, voici les mines;)

Itératif:

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

Récursif:

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

C'est comme ça que je le fais.

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

Rien d'intégré que je connaisse.

Apache Commons Lang a une classe appelée StringUtils qui contient de nombreuses fonctions de jointure.

4
JonMR

Mon tour.

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

Une alternative similaire

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

Aimez-vous mon style 3 lignes en utilisant uniquement les méthodes de la classe String?

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

Pour obtenir "str1, str2" à partir de "str1", "str2", "":

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

Aussi, vous pouvez ajouter un contrôle nul supplémentaire

0
ema

Si vous utilisez la bibliothèque fonctionnelle Java et que, pour une raison quelconque, vous ne pouvez pas utiliser les flux de Java 8 (ce qui pourrait être le cas lorsque vous utilisez Android + Retrolambda plugin), voici une solution fonctionnelle pour vous:

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

Notez que ce n'est pas l'approche la plus efficace, mais cela fonctionne bien pour les petites listes.

0
Dmitry Zaytsev